|
@@ -997,8 +997,12 @@ isolate_migratepages_range(struct compact_control *cc, unsigned long start_pfn,
|
|
|
#ifdef CONFIG_COMPACTION
|
|
|
|
|
|
/* Returns true if the page is within a block suitable for migration to */
|
|
|
-static bool suitable_migration_target(struct page *page)
|
|
|
+static bool suitable_migration_target(struct compact_control *cc,
|
|
|
+ struct page *page)
|
|
|
{
|
|
|
+ if (cc->ignore_block_suitable)
|
|
|
+ return true;
|
|
|
+
|
|
|
/* If the page is a large free page, then disallow migration */
|
|
|
if (PageBuddy(page)) {
|
|
|
/*
|
|
@@ -1083,7 +1087,7 @@ static void isolate_freepages(struct compact_control *cc)
|
|
|
continue;
|
|
|
|
|
|
/* Check the block is suitable for migration */
|
|
|
- if (!suitable_migration_target(page))
|
|
|
+ if (!suitable_migration_target(cc, page))
|
|
|
continue;
|
|
|
|
|
|
/* If isolation recently failed, do not retry */
|
|
@@ -1656,7 +1660,8 @@ static enum compact_result compact_zone_order(struct zone *zone, int order,
|
|
|
.classzone_idx = classzone_idx,
|
|
|
.direct_compaction = true,
|
|
|
.whole_zone = (prio == MIN_COMPACT_PRIORITY),
|
|
|
- .ignore_skip_hint = (prio == MIN_COMPACT_PRIORITY)
|
|
|
+ .ignore_skip_hint = (prio == MIN_COMPACT_PRIORITY),
|
|
|
+ .ignore_block_suitable = (prio == MIN_COMPACT_PRIORITY)
|
|
|
};
|
|
|
INIT_LIST_HEAD(&cc.freepages);
|
|
|
INIT_LIST_HEAD(&cc.migratepages);
|