• T
    idr: idr_alloc() shouldn't trigger lowmem warning when preloaded · 59bfbcf0
    Tejun Heo 提交于
    GFP_NOIO is often used for idr_alloc() inside preloaded section as the
    allocation mask doesn't really matter.  If the idr tree needs to be
    expanded, idr_alloc() first tries to allocate using the specified
    allocation mask and if it fails falls back to the preloaded buffer.  This
    order prevent non-preloading idr_alloc() users from taking advantage of
    preloading ones by using preload buffer without filling it shifting the
    burden of allocation to the preload users.
    
    Unfortunately, this allowed/expected-to-fail kmem_cache allocation ends up
    generating spurious slab lowmem warning before succeeding the request from
    the preload buffer.
    
    This patch makes idr_layer_alloc() add __GFP_NOWARN to the first
    kmem_cache attempt and try kmem_cache again w/o __GFP_NOWARN after
    allocation from preload_buffer fails so that lowmem warning is generated
    if not suppressed by the original @gfp_mask.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Reported-by: NDavid Teigland <teigland@redhat.com>
    Tested-by: NDavid Teigland <teigland@redhat.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    59bfbcf0
idr.c 27.9 KB