RE: [PATCH] [SCSI] megaraid: use GFP_ATOMIC under spin lock

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: James Bottomley [mailto:James.Bottomley@xxxxxxxxxxxxxxxxxxxxx]
> Sent: Wednesday, March 19, 2014 8:51 PM
> To: Desai, Kashyap
> Cc: Saxena, Sumit; Wei Yongjun; DL-MegaRAID Linux;
> simon.puels@xxxxxxxxx; jkosina@xxxxxxx;
> yongjun_wei@xxxxxxxxxxxxxxxxx; linux-scsi@xxxxxxxxxxxxxxx
> Subject: Re: [PATCH] [SCSI] megaraid: use GFP_ATOMIC under spin lock
> 
> On Wed, 2014-03-19 at 07:21 +0000, Desai, Kashyap wrote:
> >
> > > -----Original Message-----
> > > From: James Bottomley
> [mailto:James.Bottomley@xxxxxxxxxxxxxxxxxxxxx]
> > > Sent: Thursday, March 13, 2014 4:00 PM
> > > To: Saxena, Sumit
> > > Cc: Wei Yongjun; DL-MegaRAID Linux; simon.puels@xxxxxxxxx;
> > > jkosina@xxxxxxx; yongjun_wei@xxxxxxxxxxxxxxxxx; linux-
> > > scsi@xxxxxxxxxxxxxxx
> > > Subject: Re: [PATCH] [SCSI] megaraid: use GFP_ATOMIC under spin lock
> > >
> > > On Wed, 2014-01-08 at 12:16 +0000, Saxena, Sumit wrote:
> > > >
> > > > >-----Original Message-----
> > > > >From: Wei Yongjun [mailto:weiyj.lk@xxxxxxxxx]
> > > > >Sent: Friday, December 20, 2013 8:38 AM
> > > > >To: DL-MegaRAID Linux; JBottomley@xxxxxxxxxxxxx;
> > > > >simon.puels@xxxxxxxxx; jkosina@xxxxxxx
> > > > >Cc: yongjun_wei@xxxxxxxxxxxxxxxxx; linux-scsi@xxxxxxxxxxxxxxx
> > > > >Subject: [PATCH] [SCSI] megaraid: use GFP_ATOMIC under spin lock
> > > > >
> > > > >From: Wei Yongjun <yongjun_wei@xxxxxxxxxxxxxxxxx>
> > > > >
> > > > >A spin lock is taken here so we should use GFP_ATOMIC.
> > > > >
> > > > >Signed-off-by: Wei Yongjun <yongjun_wei@xxxxxxxxxxxxxxxxx>
> > > > >---
> > > > > drivers/scsi/megaraid/megaraid_mm.c | 2 +-
> > > > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > > > >
> > > > >diff --git a/drivers/scsi/megaraid/megaraid_mm.c
> > > > >b/drivers/scsi/megaraid/megaraid_mm.c
> > > > >index a706927..99fa5d3 100644
> > > > >--- a/drivers/scsi/megaraid/megaraid_mm.c
> > > > >+++ b/drivers/scsi/megaraid/megaraid_mm.c
> > > > >@@ -570,7 +570,7 @@ mraid_mm_attach_buf(mraid_mmadp_t *adp,
> > > uioc_t
> > > > >*kioc, int xferlen)
> > > > >
> > > > > 	kioc->pool_index	= right_pool;
> > > > > 	kioc->free_buf		= 1;
> > > > >-	kioc->buf_vaddr 	= pci_pool_alloc(pool->handle, GFP_KERNEL,
> > > > >+	kioc->buf_vaddr		= pci_pool_alloc(pool-
> >handle,
> > > > >GFP_ATOMIC,
> > > > > 							&kioc->buf_paddr);
> > > > > 	spin_unlock_irqrestore(&pool->lock, flags);
> > > > >
> > > > >
> > > > Acked-by: Sumit Saxena <sumit.saxena@xxxxxxx>
> > >
> > > This doesn't look like the right fix to me.  What is the function of
> > > pool->lock around this code region?  The only data you use from the
> > > pool->pool
> > > is pool->handle which is set up at init time ... there's no need to
> > > use a lock to read a piece of data which is effectively constant, so just
> drop the lock.
> >
> >
> > Just trying to understand why pool->lock was used here.
> >
> > Looks like this code may require synchronization using pool->lock
> > while modifying anything in kioc.
> 
> It's possible, but kioc seems to be allocated and freed per thread in the driver
> (mraid_mm_ioctl) so looks to me to require no locking once you have it
> allocated because there's a single thread of control per ioctl.
> 
> > Below code is part of "mraid_mm_dealloc_kioc".. and here also
> > pool->lock is used before accessing
> > Kioc->free_buf variable.
> >
> >                 /* This routine may be called in non-isr context also */
> >                 spin_lock_irqsave(&pool->lock, flags);
> >
> >                 /*
> >                  * While attaching the dma buffer, if we didn't get the
> >                  * required buffer from the pool, we would have allocated
> >                  * it at the run time and set the free_buf flag. We must
> >                  * free that buffer. Otherwise, just mark that the buffer is
> >                  * not in use
> >                  */
> >                 if (kioc->free_buf == 1)
> >                         pci_pool_free(pool->handle, kioc->buf_vaddr,
> >                                                         kioc->buf_paddr);
> >                 else
> >                         pool->in_use = 0;
> >
> >                 spin_unlock_irqrestore(&pool->lock, flags);
> 
> In this code, pool->lock protects variables in the pool (in this case
> ->in_use) which looks to be correct.  It's the chunk further down that
> appears to have no use for the locking.
> 
> > This code is not actively change now by LSI, so doing too much of
> > experiment may break something.
> > Considering pool->lock usage as a valid (As you suggested it may be
> > possible candidate for optimization.), do you consider including
> > change proposed in this patch ?
> 
> Well, if you make this change, kmalloc GFP_ATOMIC will fail far more than
> kmalloc GFP_KERNEL.  That failure will be passed straight back to the caller of
> the ioctl which, presumably, is your raid tool.  What will that do?  Fail or
> Retry? If it fails, removing the locking would be best, if it retries, we can
> probably do the GFP_ATOMIC hack.

James, I agree that with GFP_ATOMIC may fail frequently.

Wei, I hope your found this issue and fixed as part of the issue..  Is this possible to try what James has suggested. ?
Remove the lock pool->lock while accessing pool->handle without lock and keep GFG_KERNEL flag as it is.

May be you need to do IOCTL stress to check there is no race condition.

> 
> James
> 
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux