• Mel Gorman's avatar
    mm: compaction: ensure that the compaction free scanner does not move to the next zone · 7454f4ba
    Mel Gorman authored
    Compaction works with two scanners, a migration and a free scanner.  When
    the scanners crossover, migration within the zone is complete.  The
    location of the scanner is recorded on each cycle to avoid excesive
    scanning.
    
    When a zone is small and mostly reserved, it's very easy for the migration
    scanner to be close to the end of the zone.  Then the following situation
    can occurs
    
      o migration scanner isolates some pages near the end of the zone
      o free scanner starts at the end of the zone but finds that the
        migration scanner is already there
      o free scanner gets reinitialised for the next cycle as
        cc->migrate_pfn + pageblock_nr_pages
        moving the free scanner into the next zone
      o migration scanner moves into the next zone
    
    When this happens, NR_ISOLATED accounting goes haywire because some of the
    accounting happens against the wrong zone.  One zones counter remains
    positive while the other goes negative even though the overall global
    count is accurate.  This was reported on X86-32 with !SMP because !SMP
    allows the negative counters to be visible.  The fact that it is the bug
    should theoritically be possible there.
    Signed-off-by: default avatarMel Gorman <mgorman@suse.de>
    Reviewed-by: default avatarMinchan Kim <minchan.kim@gmail.com>
    Reviewed-by: default avatarMichal Hocko <mhocko@suse.cz>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    7454f4ba
compaction.c 19.5 KB