|
@@ -490,6 +490,13 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
|
|
|
|
|
|
/* If a page was split, advance to the end of it */
|
|
|
if (isolated) {
|
|
|
+ cc->nr_freepages += isolated;
|
|
|
+ if (!strict &&
|
|
|
+ cc->nr_migratepages <= cc->nr_freepages) {
|
|
|
+ blockpfn += isolated;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
blockpfn += isolated - 1;
|
|
|
cursor += isolated - 1;
|
|
|
continue;
|
|
@@ -899,7 +906,6 @@ static void isolate_freepages(struct compact_control *cc)
|
|
|
unsigned long isolate_start_pfn; /* exact pfn we start at */
|
|
|
unsigned long block_end_pfn; /* end of current pageblock */
|
|
|
unsigned long low_pfn; /* lowest pfn scanner is able to scan */
|
|
|
- int nr_freepages = cc->nr_freepages;
|
|
|
struct list_head *freelist = &cc->freepages;
|
|
|
|
|
|
/*
|
|
@@ -924,11 +930,11 @@ static void isolate_freepages(struct compact_control *cc)
|
|
|
* pages on cc->migratepages. We stop searching if the migrate
|
|
|
* and free page scanners meet or enough free pages are isolated.
|
|
|
*/
|
|
|
- for (; block_start_pfn >= low_pfn && cc->nr_migratepages > nr_freepages;
|
|
|
+ for (; block_start_pfn >= low_pfn &&
|
|
|
+ cc->nr_migratepages > cc->nr_freepages;
|
|
|
block_end_pfn = block_start_pfn,
|
|
|
block_start_pfn -= pageblock_nr_pages,
|
|
|
isolate_start_pfn = block_start_pfn) {
|
|
|
- unsigned long isolated;
|
|
|
|
|
|
/*
|
|
|
* This can iterate a massively long zone without finding any
|
|
@@ -953,9 +959,8 @@ static void isolate_freepages(struct compact_control *cc)
|
|
|
continue;
|
|
|
|
|
|
/* Found a block suitable for isolating free pages from. */
|
|
|
- isolated = isolate_freepages_block(cc, &isolate_start_pfn,
|
|
|
+ isolate_freepages_block(cc, &isolate_start_pfn,
|
|
|
block_end_pfn, freelist, false);
|
|
|
- nr_freepages += isolated;
|
|
|
|
|
|
/*
|
|
|
* Remember where the free scanner should restart next time,
|
|
@@ -987,8 +992,6 @@ static void isolate_freepages(struct compact_control *cc)
|
|
|
*/
|
|
|
if (block_start_pfn < low_pfn)
|
|
|
cc->free_pfn = cc->migrate_pfn;
|
|
|
-
|
|
|
- cc->nr_freepages = nr_freepages;
|
|
|
}
|
|
|
|
|
|
/*
|