]> git.karo-electronics.de Git - linux-beck.git/blobdiff - mm/compaction.c
mm, compaction: prevent infinite loop in compact_zone
[linux-beck.git] / mm / compaction.c
index 4f0151cfd2387e2151dabfe14b55fdd9a4e2c79f..f9792ba3537ccc830594e7954715ca66eb2e9654 100644 (file)
@@ -1039,8 +1039,12 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone,
        }
 
        acct_isolated(zone, cc);
-       /* Record where migration scanner will be restarted */
-       cc->migrate_pfn = low_pfn;
+       /*
+        * Record where migration scanner will be restarted. If we end up in
+        * the same pageblock as the free scanner, make the scanners fully
+        * meet so that compact_finished() terminates compaction.
+        */
+       cc->migrate_pfn = (end_pfn <= cc->free_pfn) ? low_pfn : cc->free_pfn;
 
        return cc->nr_migratepages ? ISOLATE_SUCCESS : ISOLATE_NONE;
 }