[lkml]   [2011]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH 1/4] mm: compaction: Ensure that the compaction free scanner does not move to the next zone
    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
    difficult to reproduce on X86-64 is probably just a co-incidence as
    the bug should theoritically be possible there.

    Signed-off-by: Mel Gorman <>
    Reviewed-by: Minchan Kim <>
    mm/compaction.c | 13 ++++++++++++-
    1 files changed, 12 insertions(+), 1 deletions(-)

    diff --git a/mm/compaction.c b/mm/compaction.c
    index 021a296..5c744ab 100644
    --- a/mm/compaction.c
    +++ b/mm/compaction.c
    @@ -144,9 +144,20 @@ static void isolate_freepages(struct zone *zone,
    int nr_freepages = cc->nr_freepages;
    struct list_head *freelist = &cc->freepages;

    + /*
    + * Initialise the free scanner. The starting point is where we last
    + * scanned from (or the end of the zone if starting). The low point
    + * is the end of the pageblock the migration scanner is using.
    + */
    pfn = cc->free_pfn;
    low_pfn = cc->migrate_pfn + pageblock_nr_pages;
    - high_pfn = low_pfn;
    + /*
    + * Take care that if the migration scanner is at the end of the zone
    + * that the free scanner does not accidentally move to the next zone
    + * in the next isolation cycle.
    + */
    + high_pfn = min(low_pfn, pfn);

    * Isolate free pages until enough are available to migrate the

     \ /
      Last update: 2011-06-07 17:09    [W:0.022 / U:14.012 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site