All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hannes Reinecke <hare@suse.de>
To: Christoph Hellwig <hch@lst.de>
Cc: James Bottomley <james.bottomley@hansenpartnership.com>,
	"Martin K. Petersen" <martin.petersen@oracle.com>,
	Bart van Assche <bart.vanassche@sandisk.com>,
	linux-scsi@vger.kernel.org
Subject: Re: [PATCH 19/23] scsi_dh_alua: Use workqueue for RTPG
Date: Tue, 1 Sep 2015 14:57:57 +0200	[thread overview]
Message-ID: <55E5A0D5.5070402@suse.de> (raw)
In-Reply-To: <20150901111517.GB10589@lst.de>

On 09/01/2015 01:15 PM, Christoph Hellwig wrote:
>> +	unsigned long		expiry;
>> +	unsigned long		interval;
>> +	struct workqueue_struct *work_q;
>> +	struct delayed_work	rtpg_work;
>> +	struct delayed_work	stpg_work;
>> +	struct delayed_work	qdata_work;
>> +	spinlock_t		rtpg_lock;
> 
> This one also protects ->flag.  I'd just call it lock, and
> introduce it at the time struct alua_port_group is introduced,
> so that we can have coherent locking from the very beginning.
> 
Okay.

>> +struct alua_queue_data {
>> +	struct list_head	entry;
>>  	activate_complete	callback_fn;
>>  	void			*callback_data;
> 
> I've been looking over the active callback for a while, and I
> think the model of it is fundamentally broken.  Yes, as long as
> multipathing isn't in SCSI we'll need path change notifications
> for dm-mpath, but I don't see how tying them into ->activate
> makes any sense.
> 
> I guess for this series we're stuck with it, but in the long
> run we should have a callback in the request_queue which the
> consumer that has bd_claim()ed the device can set and get path
> change notifications instead.
> 
That is what I'm eventually planning to do.
My final goal is to move the multipath path monitoring stuff
into the kernel (via the block device polling mechanism), and sending
block events for path failure and re-establishment.

But that'll be subject to further patches :-)

> That being said after spending a lot of time reading this code I think
> my orginal advice to use different work_structs for the different
> kinds of events was wrong, and I'd like to apologize for making you
> go down that direction.
> 
> STPG/RTPG is just too dependent to sensibly split them up, and the
> qdata bit while broken can be shoe horned in for now.  So I'd suggest
> to revert back to the original model with a single work_struct per
> port group, and a global workqueue.
> 
Weelll ... there was a reason why I did that initially :-)
But anyway, no harm done. I still have the original series around.

>> -	if (h->pg)
>> +	if (h->pg) {
>> +		synchronize_rcu();
>>  		return SCSI_DH_OK;
>> +	}
> 
> What is this synchronize_rcu supposed to help with?
> 
>> -		h->pg = tmp_pg;
>>  		kref_get(&tmp_pg->kref);
>> +		spin_lock(&h->pg_lock);
>> +		rcu_assign_pointer(h->pg, tmp_pg);
>> +		spin_unlock(&h->pg_lock);
> 
> I think the assignment to h->ph should have been past the kref_get
> from the very beginning, please fold this into the original patch.
> 
Okay.

>> +	struct alua_port_group *pg = NULL;
>> +	int error;
>> +
>> +	mutex_lock(&h->init_mutex);
>> +	error = alua_check_tpgs(sdev, h);
>> +	if (error == SCSI_DH_OK) {
>> +		error = alua_check_vpd(sdev, h);
>> +		rcu_read_lock();
>> +		pg = rcu_dereference(h->pg);
>> +		if (!pg) {
>> +			rcu_read_unlock();
>> +			h->tpgs = TPGS_MODE_NONE;
>> +			error = SCSI_DH_DEV_UNSUPP;
>> +		} else {
>> +			WARN_ON(error != SCSI_DH_OK);
>> +			kref_get(&pg->kref);
>> +			rcu_read_unlock();
>> +		}
>> +	}
> 
> Eww. Please grab the reference to the pg inside the replacement for
> alua_check_vpd, and ensure that we never return from that without a
> valid h->pg.  Together with the previously suggested removal of h->tpgs,
> and moving the call to alua_rtpg_queue into the alua_check_vpd replacement
> that would keep alua_initialize nice and simple.
> 
You are right in that the interface for alua_check_tpgs isn't very
clear. Currently we need to check both the return code _and_ 'h->pg',
even though both are interrelated.
I guess it should rather be 'h->pg = alua_check_vpd()' or even making
alua_check_vpd() a void function, which would eliminate the need for the
separate return value.
I'll have to think about it.

>> @@ -679,6 +895,10 @@ static int alua_set_params(struct scsi_device *sdev, const char *params)
>>  	unsigned int optimize = 0, argc;
>>  	const char *p = params;
>>  	int result = SCSI_DH_OK;
>> +	unsigned long flags;
>> +
>> +	if (!h)
>> +		return -ENXIO;
> 
> How could that happen?  Why does it beling into this patch?
> 
Leftover from the original patch, which didn't have your scsi_dh
patchset. I'll remove it.

>> @@ -723,24 +944,46 @@ static int alua_activate(struct scsi_device *sdev,
>>  {
>>  	struct alua_dh_data *h = sdev->handler_data;
>>  	int err = SCSI_DH_OK;
>> +	struct alua_queue_data *qdata;
>> +	struct alua_port_group *pg;
>>  
>> -	if (!h->pg)
>> +	if (!h) {
>> +		err = SCSI_DH_NOSYS;
>>  		goto out;
>> +	}
> 
> Same here.
> 
>> +	qdata = kzalloc(sizeof(*qdata), GFP_KERNEL);
>> +	if (!qdata) {
>> +		err = SCSI_DH_RES_TEMP_UNAVAIL;
>> +		goto out;
>> +	}
>> +	qdata->callback_fn = fn;
>> +	qdata->callback_data = data;
>>  
>> +	mutex_lock(&h->init_mutex);
>> +	rcu_read_lock();
>> +	pg = rcu_dereference(h->pg);
>> +	if (!pg) {
>> +		rcu_read_unlock();
>> +		kfree(qdata);
>> +		err = h->init_error;
>> +		mutex_unlock(&h->init_mutex);
>>  		goto out;
>>  	}
>> +	mutex_unlock(&h->init_mutex);
>> +	fn = NULL;
>> +	kref_get(&pg->kref);
>> +	rcu_read_unlock();
>> +
>> +	if (optimize_stpg) {
>> +		unsigned long flags;
>> +
>> +		spin_lock_irqsave(&pg->rtpg_lock, flags);
>> +		pg->flags |= ALUA_OPTIMIZE_STPG;
>> +		spin_unlock_irqrestore(&pg->rtpg_lock, flags);
>> +	}
> 
> The optimize_stpg should have been moved towards the alua_port_group
> allocation earlier in the series, please fold that in there.
> 
Okay.

>> +	alua_rtpg_queue(pg, sdev, qdata);
>> +	kref_put(&pg->kref, release_port_group);
> 
> Note that all alua_rtpg_queue callers already have a reference to the
> PG, so I don't think we need to grab another one inside it or even
> check for a NULL pg.
> 
In general I try to follow the rule of getting an initial reference, and
another one whenever the port_group structure is put on the workqueue.
But I'll check here if the additional reference is warranted.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  reply	other threads:[~2015-09-01 12:58 UTC|newest]

Thread overview: 93+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-27 12:40 [PATCHv4 00/23] asynchronous ALUA device handler Hannes Reinecke
2015-08-27 12:40 ` [PATCH 01/23] scsi_dh_alua: Disable ALUA handling for non-disk devices Hannes Reinecke
2015-09-01  9:37   ` Christoph Hellwig
2015-09-04  3:36   ` Martin K. Petersen
2015-09-22 18:28   ` Ewan Milne
2015-08-27 12:41 ` [PATCH 02/23] scsi_dh_alua: Use vpd_pg83 information Hannes Reinecke
2015-09-04  3:37   ` Martin K. Petersen
2015-09-22 18:29   ` Ewan Milne
2015-08-27 12:41 ` [PATCH 03/23] scsi_dh_alua: improved logging Hannes Reinecke
2015-09-04  3:38   ` Martin K. Petersen
2015-09-22 18:30   ` Ewan Milne
2015-08-27 12:41 ` [PATCH 04/23] scsi_dh_alua: use standard logging functions Hannes Reinecke
2015-09-01  9:48   ` Christoph Hellwig
2015-09-01 12:39     ` Hannes Reinecke
2015-09-22 18:32   ` Ewan Milne
2015-08-27 12:41 ` [PATCH 05/23] scsi_dh_alua: return standard SCSI return codes in submit_rtpg Hannes Reinecke
2015-09-01  9:52   ` Christoph Hellwig
2015-09-22 18:34   ` Ewan Milne
2015-08-27 12:41 ` [PATCH 06/23] scsi_dh_alua: fixup description of stpg_endio() Hannes Reinecke
2015-09-01  9:52   ` Christoph Hellwig
2015-09-04  3:40   ` Martin K. Petersen
2015-09-22 18:36   ` Ewan Milne
2015-08-27 12:41 ` [PATCH 07/23] scsi: remove scsi_show_sense_hdr() Hannes Reinecke
2015-09-04  3:41   ` Martin K. Petersen
2015-09-22 18:36   ` Ewan Milne
2015-08-27 12:41 ` [PATCH 08/23] scsi_dh_alua: use flag for RTPG extended header Hannes Reinecke
2015-09-04  3:42   ` Martin K. Petersen
2015-09-22 18:37   ` Ewan Milne
2015-08-27 12:41 ` [PATCH 09/23] scsi_dh_alua: use unaligned access macros Hannes Reinecke
2015-09-01  9:53   ` Christoph Hellwig
2015-09-04  3:43   ` Martin K. Petersen
2015-09-22 18:37   ` Ewan Milne
2015-08-27 12:41 ` [PATCH 10/23] scsi_dh_alua: Pass buffer as function argument Hannes Reinecke
2015-09-01  9:55   ` Christoph Hellwig
2015-09-04  3:44   ` Martin K. Petersen
2015-09-22 18:43   ` Ewan Milne
2015-09-24 16:37     ` Hannes Reinecke
2015-08-27 12:41 ` [PATCH 11/23] scsi_dh_alua: Make stpg synchronous Hannes Reinecke
2015-09-01 10:04   ` Christoph Hellwig
2015-09-01 12:58     ` Hannes Reinecke
2015-09-22 18:50   ` Ewan Milne
2015-09-24 16:47     ` Hannes Reinecke
2015-08-27 12:41 ` [PATCH 12/23] scsi_dh_alua: switch to scsi_execute_req_flags() Hannes Reinecke
2015-09-01 10:07   ` Christoph Hellwig
2015-09-22 18:54   ` Ewan Milne
2015-08-27 12:41 ` [PATCH 13/23] scsi_dh_alua: Use separate alua_port_group structure Hannes Reinecke
2015-09-01 10:20   ` Christoph Hellwig
2015-09-01 13:02     ` Hannes Reinecke
2015-09-01 13:44       ` Christoph Hellwig
2015-09-01 14:01         ` Hannes Reinecke
2015-09-01 10:48   ` Christoph Hellwig
2015-09-22 18:57   ` Ewan Milne
2015-08-27 12:41 ` [PATCH 14/23] scsi_dh_alua: allocate RTPG buffer separately Hannes Reinecke
2015-09-22 19:04   ` Ewan Milne
2015-09-24 17:19     ` Hannes Reinecke
2015-08-27 12:41 ` [PATCH 15/23] scsi_dh_alua: simplify sense code handling Hannes Reinecke
2015-09-22 19:10   ` Ewan Milne
2015-09-28  6:41     ` Hannes Reinecke
2015-08-27 12:41 ` [PATCH 16/23] scsi: Add scsi_vpd_lun_id() Hannes Reinecke
2015-09-01 10:22   ` Christoph Hellwig
2015-09-01 12:43     ` Hannes Reinecke
2015-09-22 19:17   ` Ewan Milne
2015-09-28  7:18     ` Hannes Reinecke
2015-08-27 12:41 ` [PATCH 17/23] scsi_dh_alua: use unique device id Hannes Reinecke
2015-09-01 10:25   ` Christoph Hellwig
2015-09-22 19:31   ` Ewan Milne
2015-09-28  7:41     ` Hannes Reinecke
2015-08-27 12:41 ` [PATCH 18/23] revert "scsi_dh_alua: ALUA hander attach should succeed while TPG is transitioning" Hannes Reinecke
2015-09-22 19:34   ` Ewan Milne
2015-08-27 12:41 ` [PATCH 19/23] scsi_dh_alua: Use workqueue for RTPG Hannes Reinecke
2015-09-01 11:15   ` Christoph Hellwig
2015-09-01 12:57     ` Hannes Reinecke [this message]
2015-09-02  6:39       ` Christoph Hellwig
2015-09-02  8:48         ` Hannes Reinecke
2015-11-05 20:34           ` Todd Gill
2015-09-22 19:49   ` Ewan Milne
2015-09-22 20:15     ` Hannes Reinecke
2015-09-23 13:58       ` Ewan Milne
2015-08-27 12:41 ` [PATCH 20/23] scsi_dh_alua: Recheck state on unit attention Hannes Reinecke
2015-09-01 10:31   ` Christoph Hellwig
2015-09-22 19:57   ` Ewan Milne
2015-09-23 13:01     ` Hannes Reinecke
2015-08-27 12:41 ` [PATCH 21/23] scsi_dh_alua: update all port states Hannes Reinecke
2015-09-01 10:32   ` Christoph Hellwig
2015-09-22 20:04   ` Ewan Milne
2015-09-22 20:20     ` Hannes Reinecke
2015-08-27 12:41 ` [PATCH 22/23] scsi_dh_alua: Send TEST UNIT READY to poll for transitioning Hannes Reinecke
2015-09-01 10:34   ` Christoph Hellwig
2015-09-22 20:05   ` Ewan Milne
2015-08-27 12:41 ` [PATCH 23/23] scsi_dh_alua: Update version to 2.0 Hannes Reinecke
2015-09-01 10:34   ` Christoph Hellwig
2015-09-22 20:05   ` Ewan Milne
2015-09-24 16:25 ` [PATCHv4 00/23] asynchronous ALUA device handler Bart Van Assche

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55E5A0D5.5070402@suse.de \
    --to=hare@suse.de \
    --cc=bart.vanassche@sandisk.com \
    --cc=hch@lst.de \
    --cc=james.bottomley@hansenpartnership.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.