• Rik van Riel's avatar
    mm: have order > 0 compaction start off where it left · 7db8889a
    Rik van Riel authored
    Order > 0 compaction stops when enough free pages of the correct page
    order have been coalesced.  When doing subsequent higher order
    allocations, it is possible for compaction to be invoked many times.
    
    However, the compaction code always starts out looking for things to
    compact at the start of the zone, and for free pages to compact things to
    at the end of the zone.
    
    This can cause quadratic behaviour, with isolate_freepages starting at the
    end of the zone each time, even though previous invocations of the
    compaction code already filled up all free memory on that end of the zone.
    
    This can cause isolate_freepages to take enormous amounts of CPU with
    certain workloads on larger memory systems.
    
    The obvious solution is to have isolate_freepages remember where it left
    off last time, and continue at that point the next time it gets invoked
    for an order > 0 compaction.  This could cause compaction to fail if
    cc->free_pfn and cc->migrate_pfn are close together initially, in that
    case we restart from the end of the zone and try once more.
    
    Forced full (order == -1) compactions are left alone.
    
    [akpm@linux-foundation.org: checkpatch fixes]
    [akpm@linux-foundation.org: s/laste/last/, use 80 cols]
    Signed-off-by: default avatarRik van Riel <riel@redhat.com>
    Reported-by: default avatarJim Schutt <jaschut@sandia.gov>
    Tested-by: default avatarJim Schutt <jaschut@sandia.gov>
    Cc: Minchan Kim <minchan.kim@gmail.com>
    Reviewed-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Acked-by: default avatarMel Gorman <mel@csn.ul.ie>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    7db8889a
internal.h 10.3 KB