• Vlastimil Babka's avatar
    mm: compaction: reset cached scanner pfn's before reading them · d3132e4b
    Vlastimil Babka authored
    Compaction caches pfn's for its migrate and free scanners to avoid
    scanning the whole zone each time.  In compact_zone(), the cached values
    are read to set up initial values for the scanners.  There are several
    situations when these cached pfn's are reset to the first and last pfn
    of the zone, respectively.  One of these situations is when a compaction
    has been deferred for a zone and is now being restarted during a direct
    compaction, which is also done in compact_zone().
    
    However, compact_zone() currently reads the cached pfn's *before*
    resetting them.  This means the reset doesn't affect the compaction that
    performs it, and with good chance also subsequent compactions, as
    update_pageblock_skip() is likely to be called and update the cached
    pfn's to those being processed.  Another chance for a successful reset
    is when a direct compaction detects that migration and free scanners
    meet (which has its own problems addressed by another patch) and sets
    update_pageblock_skip flag which kswapd uses to do the reset because it
    goes to sleep.
    
    This is clearly a bug that results in non-deterministic behavior, so
    this patch moves the cached pfn reset to be performed *before* the
    values are read.
    Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Acked-by: default avatarMel Gorman <mgorman@suse.de>
    Acked-by: default avatarRik van Riel <riel@redhat.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d3132e4b
compaction.c 32.5 KB