Skip to content
  • Vladimir Davydov's avatar
    slab: fix cpuset check in fallback_alloc · 061d7074
    Vladimir Davydov authored
    
    
    fallback_alloc is called on kmalloc if the preferred node doesn't have
    free or partial slabs and there's no pages on the node's free list
    (GFP_THISNODE allocations fail).  Before invoking the reclaimer it tries
    to locate a free or partial slab on other allowed nodes' lists.  While
    iterating over the preferred node's zonelist it skips those zones which
    hardwall cpuset check returns false for.  That means that for a task bound
    to a specific node using cpusets fallback_alloc will always ignore free
    slabs on other nodes and go directly to the reclaimer, which, however, may
    allocate from other nodes if cpuset.mem_hardwall is unset (default).  As a
    result, we may get lists of free slabs grow without bounds on other nodes,
    which is bad, because inactive slabs are only evicted by cache_reap at a
    very slow rate and cannot be dropped forcefully.
    
    To reproduce the issue, run a process that will walk over a directory tree
    with lots of files inside a cpuset bound to a node that constantly
    experiences memory pressure.  Look at num_slabs vs active_slabs growth as
    reported by /proc/slabinfo.
    
    To avoid this we should use softwall cpuset check in fallback_alloc.
    
    Signed-off-by: default avatarVladimir Davydov <vdavydov@parallels.com>
    Acked-by: default avatarZefan Li <lizefan@huawei.com>
    Acked-by: default avatarChristoph Lameter <cl@linux.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Tejun Heo <tj@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    061d7074