[PATCH v3 28/32] cxlflash: Fix to avoid state change collision

Matthew R. Ochs mrochs at linux.vnet.ibm.com
Sat Sep 26 08:31:39 AEST 2015


> On Sep 25, 2015, at 4:10 PM, Brian King <brking at linux.vnet.ibm.com> wrote:
> On 09/24/2015 02:42 PM, Matthew R. Ochs wrote:
>> diff --git a/drivers/scsi/cxlflash/main.c b/drivers/scsi/cxlflash/main.c
>> index ab11ee6..325ba31 100644
>> --- a/drivers/scsi/cxlflash/main.c
>> +++ b/drivers/scsi/cxlflash/main.c
>> @@ -496,6 +496,7 @@ static int cxlflash_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scp)
>> 	struct cxlflash_cfg *cfg = (struct cxlflash_cfg *)host->hostdata;
>> 	struct afu *afu = cfg->afu;
>> 	struct device *dev = &cfg->dev->dev;
>> +	enum cxlflash_state state;
>> 	struct afu_cmd *cmd;
>> 	u32 port_sel = scp->device->channel + 1;
>> 	int nseg, i, ncount;
>> @@ -525,7 +526,11 @@ static int cxlflash_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scp)
>> 	}
>> 	spin_unlock_irqrestore(&cfg->tmf_slock, lock_flags);
>> 
>> -	switch (cfg->state) {
>> +	mutex_lock(&cfg->mutex);
>> +	state = cfg->state;
>> +	mutex_unlock(&cfg->mutex);
> 
> You can't grab a mutex in queuecommand, since it can sleep and queuecommand can be called from soft irq context.
> 
> Also, I'm not sure what to think about this patch in general. Obviously state can change immediately after
> you drop the mutex, and according to Documentation/memory-barriers.txt, memory operations after the unlock can
> occur before the unlock occurs. Is this a problem?

You bring up some good points.

I'm going to remove this patch from the set and rework it.


-matt


More information about the Linuxppc-dev mailing list