On Tue, 29 Jul 2025, Dongsheng Yang wrote:

> > > > Just a suggestion for performance improvement: when you hold a 
> > > > spinlock a you need to allocate some memory, you must drop the 
> > > > spinlock, allocate it with GFP_NOIO, reacquire the spinlock and 
> > > > recheck the state. You can improve this logic by allocating with 
> > > > mempool_alloc(GFP_NOWAIT) while you hold the spinlock (GFP_NOWAIT 
> > > > will not sleep, so it's allowed), and fallback to dropping the 
> > > > spinlock only if the GFP_NOWAIT allocation fails.
> > > 
> > > Sounds a good suggestion, I will try it in V5.
> >
> > Yes. When you implement it, don't forget to test the code path that drops
> > the spinlock and uses mempool_alloc(GFP_NOIO), so that it doesn't bitrot
> > over time.
> 
> 
> Sure, the failslab case can cover this path:
> 
> https://github.com/DataTravelGuide/dtg-tests/blob/main/pcache.py.data/pcache_failslab.sh
> 
> 
> Dongsheng

failslab doesn't test mempool allocation failures - see the function 
mempool_alloc_noprof:

it tries to allocate using
        element = pool->alloc(gfp_temp, pool->pool_data);
if it fails (the failure may be caused by failslab), it goes down this 
path
        spin_lock_irqsave(&pool->lock, flags);
        if (likely(pool->curr_nr)) {
                element = remove_element(pool);
                spin_unlock_irqrestore(&pool->lock, flags);
                /* paired with rmb in mempool_free(), read comment there */
                smp_wmb();
                /*
                 * Update the allocation stack trace as this is more useful
                 * for debugging.
                 */
                kmemleak_update_trace(element);
                return element;
        }

so, it will not simulate a situation where the mempool is depleted.

It may be worthwhile to extend failslab, so that it makes mempool_alloc 
randomly return NULL for non-sleeping allocations (i.e. allocations 
without __GFP_DIRECT_RECLAIM) and submit the patch to failslab 
maintainers.

Mikulas


Reply via email to