|
@@ -526,8 +526,25 @@ isolate_migratepages_range(struct zone *zone, struct compact_control *cc,
|
|
|
|
|
|
/* If isolation recently failed, do not retry */
|
|
|
pageblock_nr = low_pfn >> pageblock_order;
|
|
|
- if (!isolation_suitable(cc, page))
|
|
|
- goto next_pageblock;
|
|
|
+ if (last_pageblock_nr != pageblock_nr) {
|
|
|
+ int mt;
|
|
|
+
|
|
|
+ last_pageblock_nr = pageblock_nr;
|
|
|
+ if (!isolation_suitable(cc, page))
|
|
|
+ goto next_pageblock;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * For async migration, also only scan in MOVABLE
|
|
|
+ * blocks. Async migration is optimistic to see if
|
|
|
+ * the minimum amount of work satisfies the allocation
|
|
|
+ */
|
|
|
+ mt = get_pageblock_migratetype(page);
|
|
|
+ if (!cc->sync && !migrate_async_suitable(mt)) {
|
|
|
+ cc->finished_update_migrate = true;
|
|
|
+ skipped_async_unsuitable = true;
|
|
|
+ goto next_pageblock;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Skip if free. page_order cannot be used without zone->lock
|
|
@@ -536,18 +553,6 @@ isolate_migratepages_range(struct zone *zone, struct compact_control *cc,
|
|
|
if (PageBuddy(page))
|
|
|
continue;
|
|
|
|
|
|
- /*
|
|
|
- * For async migration, also only scan in MOVABLE blocks. Async
|
|
|
- * migration is optimistic to see if the minimum amount of work
|
|
|
- * satisfies the allocation
|
|
|
- */
|
|
|
- if (!cc->sync && last_pageblock_nr != pageblock_nr &&
|
|
|
- !migrate_async_suitable(get_pageblock_migratetype(page))) {
|
|
|
- cc->finished_update_migrate = true;
|
|
|
- skipped_async_unsuitable = true;
|
|
|
- goto next_pageblock;
|
|
|
- }
|
|
|
-
|
|
|
/*
|
|
|
* Check may be lockless but that's ok as we recheck later.
|
|
|
* It's possible to migrate LRU pages and balloon pages
|
|
@@ -639,7 +644,6 @@ check_compact_cluster:
|
|
|
|
|
|
next_pageblock:
|
|
|
low_pfn = ALIGN(low_pfn + 1, pageblock_nr_pages) - 1;
|
|
|
- last_pageblock_nr = pageblock_nr;
|
|
|
}
|
|
|
|
|
|
acct_isolated(zone, locked, cc);
|