On Wed, 2019-04-24 at 08:24 -0700, James Bottomley wrote:
> On Wed, 2019-04-24 at 15:52 +0800, Ming Lei wrote:
> > On Tue, Apr 23, 2019 at 08:37:15AM -0700, Bart Van Assche wrote:
> > > On Tue, 2019-04-23 at 18:32 +0800, Ming Lei wrote:
> > > >  #define  SCSI_INLINE_PROT_SG_CNT  1
> > > >  
> > > > +#define  SCSI_INLINE_SG_CNT  2
> > > 
> > > So this patch inserts one kmalloc() and one kfree() call in the hot
> > > path for every SCSI request with more than two elements in its
> > > scatterlist? Isn't
> > 
> > Slab or its variants are designed for fast path, and NVMe PCI uses
> > slab for allocating sg list in fast path too.
> 
> Actually, that's not really true  base kmalloc can do all sorts of
> things including kick off reclaim so it's not really something we like
> using in the fast path.  The only fast and safe kmalloc you can rely on
>  in the fast path is GFP_ATOMIC which will fail quickly if no memory
> can easily be found.  *However* the sg_table allocation functions are
> all pool backed (lib/sg_pool.c), so they use the lightweight GFP_ATOMIC
> mechanism for kmalloc initially coupled with a backing pool in case of
> failure to ensure forward progress.
> 
> So, I think you're both right: you shouldn't simply use kmalloc, but
> this implementation doesn't, it uses the sg_table allocation functions
> which correctly control kmalloc to be lightweight and efficient and
> able to make forward progress.

Another concern is whether this change can cause a livelock. If the system
is running out of memory and the page cache submits a write request with
a scatterlist with more than two elements, if the kmalloc() for the
scatterlist fails, will that prevent the page cache from making any progress
with writeback?

Bart.

Reply via email to