• Vlastimil Babka's avatar
    mm, page_alloc: split smallest stolen page in fallback · 3bc48f96
    Vlastimil Babka authored
    The __rmqueue_fallback() function is called when there's no free page of
    requested migratetype, and we need to steal from a different one.
    
    There are various heuristics to make this event infrequent and reduce
    permanent fragmentation.  The main one is to try stealing from a
    pageblock that has the most free pages, and possibly steal them all at
    once and convert the whole pageblock.  Precise searching for such
    pageblock would be expensive, so instead the heuristics walks the free
    lists from MAX_ORDER down to requested order and assumes that the block
    with highest-order free page is likely to also have the most free pages
    in total.
    
    Chances are that together with the highest-order page, we steal also
    pages of lower orders from the same block.  But then we still split the
    highest order page.  This is wasteful and can contribute to
    fragmentation instead of avoiding it.
    
    This patch thus changes __rmqueue_fallback() to just steal the page(s)
    and put them on the freelist of the requested migratetype, and only
    report whether it was successful.  Then we pick (and eventually split)
    the smallest page with __rmqueue_smallest().  This all happens under
    zone lock, so nobody can steal it from us in the process.  This should
    reduce fragmentation due to fallbacks.  At worst we are only stealing a
    single highest-order page and waste some cycles by moving it between
    lists and then removing it, but fallback is not exactly hot path so that
    should not be a concern.  As a side benefit the patch removes some
    duplicate code by reusing __rmqueue_smallest().
    
    [vbabka@suse.cz: fix endless loop in the modified __rmqueue()]
      Link: http://lkml.kernel.org/r/59d71b35-d556-4fc9-ee2e-1574259282fd@suse.cz
    Link: http://lkml.kernel.org/r/20170307131545.28577-4-vbabka@suse.czSigned-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Acked-by: default avatarMel Gorman <mgorman@techsingularity.net>
    Acked-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: David Rientjes <rientjes@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    3bc48f96
page_alloc.c 207 KB