Skip to content
  • Christoph Lameter's avatar
    [PATCH] slab: better fallback allocation behavior · 3c517a61
    Christoph Lameter authored
    
    
    Currently we simply attempt to allocate from all allowed nodes using
    GFP_THISNODE.  However, GFP_THISNODE does not do reclaim (it wont do any at
    all if the recent GFP_THISNODE patch is accepted).  If we truly run out of
    memory in the whole system then fallback_alloc may return NULL although
    memory may still be available if we would perform more thorough reclaim.
    
    This patch changes fallback_alloc() so that we first only inspect all the
    per node queues for available slabs.  If we find any then we allocate from
    those.  This avoids slab fragmentation by first getting rid of all partial
    allocated slabs on every node before allocating new memory.
    
    If we cannot satisfy the allocation from any per node queue then we extend
    a slab.  We now call into the page allocator without specifying
    GFP_THISNODE.  The page allocator will then implement its own fallback (in
    the given cpuset context), perform necessary reclaim (again considering not
    a single node but the whole set of allowed nodes) and then return pages for
    a new slab.
    
    We identify from which node the pages were allocated and then insert the
    pages into the corresponding per node structure.  In order to do so we need
    to modify cache_grow() to take a parameter that specifies the new slab.
    kmem_getpages() can no longer set the GFP_THISNODE flag since we need to be
    able to use kmem_getpage to allocate from an arbitrary node.  GFP_THISNODE
    needs to be specified when calling cache_grow().
    
    One key advantage is that the decision from which node to allocate new
    memory is removed from slab fallback processing.  The patch allows to go
    back to use of the page allocators fallback/reclaim logic.
    
    Signed-off-by: default avatarChristoph Lameter <clameter@sgi.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    3c517a61