|
@@ -251,7 +251,6 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
|
|
|
{
|
|
|
int nr_scanned = 0, total_isolated = 0;
|
|
|
struct page *cursor, *valid_page = NULL;
|
|
|
- unsigned long nr_strict_required = end_pfn - blockpfn;
|
|
|
unsigned long flags;
|
|
|
bool locked = false;
|
|
|
|
|
@@ -264,11 +263,12 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
|
|
|
|
|
|
nr_scanned++;
|
|
|
if (!pfn_valid_within(blockpfn))
|
|
|
- continue;
|
|
|
+ goto isolate_fail;
|
|
|
+
|
|
|
if (!valid_page)
|
|
|
valid_page = page;
|
|
|
if (!PageBuddy(page))
|
|
|
- continue;
|
|
|
+ goto isolate_fail;
|
|
|
|
|
|
/*
|
|
|
* The zone lock must be held to isolate freepages.
|
|
@@ -289,12 +289,10 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
|
|
|
|
|
|
/* Recheck this is a buddy page under lock */
|
|
|
if (!PageBuddy(page))
|
|
|
- continue;
|
|
|
+ goto isolate_fail;
|
|
|
|
|
|
/* Found a free page, break it into order-0 pages */
|
|
|
isolated = split_free_page(page);
|
|
|
- if (!isolated && strict)
|
|
|
- break;
|
|
|
total_isolated += isolated;
|
|
|
for (i = 0; i < isolated; i++) {
|
|
|
list_add(&page->lru, freelist);
|
|
@@ -305,7 +303,15 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
|
|
|
if (isolated) {
|
|
|
blockpfn += isolated - 1;
|
|
|
cursor += isolated - 1;
|
|
|
+ continue;
|
|
|
}
|
|
|
+
|
|
|
+isolate_fail:
|
|
|
+ if (strict)
|
|
|
+ break;
|
|
|
+ else
|
|
|
+ continue;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
trace_mm_compaction_isolate_freepages(nr_scanned, total_isolated);
|
|
@@ -315,7 +321,7 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
|
|
|
* pages requested were isolated. If there were any failures, 0 is
|
|
|
* returned and CMA will fail.
|
|
|
*/
|
|
|
- if (strict && nr_strict_required > total_isolated)
|
|
|
+ if (strict && blockpfn < end_pfn)
|
|
|
total_isolated = 0;
|
|
|
|
|
|
if (locked)
|