Skip to content
  • Vlastimil Babka's avatar
    mm, compaction: skip buddy pages by their order in the migrate scanner · 99c0fd5e
    Vlastimil Babka authored
    
    
    The migration scanner skips PageBuddy pages, but does not consider their
    order as checking page_order() is generally unsafe without holding the
    zone->lock, and acquiring the lock just for the check wouldn't be a good
    tradeoff.
    
    Still, this could avoid some iterations over the rest of the buddy page,
    and if we are careful, the race window between PageBuddy() check and
    page_order() is small, and the worst thing that can happen is that we skip
    too much and miss some isolation candidates.  This is not that bad, as
    compaction can already fail for many other reasons like parallel
    allocations, and those have much larger race window.
    
    This patch therefore makes the migration scanner obtain the buddy page
    order and use it to skip the whole buddy page, if the order appears to be
    in the valid range.
    
    It's important that the page_order() is read only once, so that the value
    used in the checks and in the pfn calculation is the same.  But in theory
    the compiler can replace the local variable by multiple inlines of
    page_order().  Therefore, the patch introduces page_order_unsafe() that
    uses ACCESS_ONCE to prevent this.
    
    Testing with stress-highalloc from mmtests shows a 15% reduction in number
    of pages scanned by migration scanner.  The reduction is >60% with
    __GFP_NO_KSWAPD allocations, along with success rates better by few
    percent.
    
    Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Reviewed-by: default avatarZhang Yanfei <zhangyanfei@cn.fujitsu.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Acked-by: default avatarMel Gorman <mgorman@suse.de>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Michal Nazarewicz <mina86@mina86.com>
    Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Rik van Riel <riel@redhat.com>
    Acked-by: default avatarDavid Rientjes <rientjes@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    99c0fd5e