summaryrefslogtreecommitdiff
path: root/mm/compaction.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/compaction.c')
-rw-r--r--mm/compaction.c22
1 files changed, 7 insertions, 15 deletions
diff --git a/mm/compaction.c b/mm/compaction.c
index 3c60e3d5237e..58441220b953 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -688,7 +688,6 @@ static void isolate_freepages(struct zone *zone,
unsigned long block_start_pfn; /* start of current pageblock */
unsigned long block_end_pfn; /* end of current pageblock */
unsigned long low_pfn; /* lowest pfn scanner is able to scan */
- unsigned long next_free_pfn; /* start pfn for scaning at next round */
int nr_freepages = cc->nr_freepages;
struct list_head *freelist = &cc->freepages;
@@ -709,12 +708,6 @@ static void isolate_freepages(struct zone *zone,
low_pfn = ALIGN(cc->migrate_pfn + 1, pageblock_nr_pages);
/*
- * If no pages are isolated, the block_start_pfn < low_pfn check
- * will kick in.
- */
- next_free_pfn = 0;
-
- /*
* Isolate free pages until enough are available to migrate the
* pages on cc->migratepages. We stop searching if the migrate
* and free page scanners meet or enough free pages are isolated.
@@ -754,19 +747,19 @@ static void isolate_freepages(struct zone *zone,
continue;
/* Found a block suitable for isolating free pages from */
+ cc->free_pfn = block_start_pfn;
isolated = isolate_freepages_block(cc, block_start_pfn,
block_end_pfn, freelist, false);
nr_freepages += isolated;
/*
- * Record the highest PFN we isolated pages from. When next
- * looking for free pages, the search will restart here as
- * page migration may have returned some pages to the allocator
+ * Set a flag that we successfully isolated in this pageblock.
+ * In the next loop iteration, zone->compact_cached_free_pfn
+ * will not be updated and thus it will effectively contain the
+ * highest pageblock we isolated pages from.
*/
- if (isolated && next_free_pfn == 0) {
+ if (isolated)
cc->finished_update_free = true;
- next_free_pfn = block_start_pfn;
- }
}
/* split_free_page does not map the pages */
@@ -777,9 +770,8 @@ static void isolate_freepages(struct zone *zone,
* so that compact_finished() may detect this
*/
if (block_start_pfn < low_pfn)
- next_free_pfn = cc->migrate_pfn;
+ cc->free_pfn = cc->migrate_pfn;
- cc->free_pfn = next_free_pfn;
cc->nr_freepages = nr_freepages;
}