summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/compaction.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/mm/compaction.c b/mm/compaction.c
index 5325211398f8..e609415059e8 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -1061,6 +1061,9 @@ static bool suitable_migration_source(struct compact_control *cc,
1061{ 1061{
1062 int block_mt; 1062 int block_mt;
1063 1063
1064 if (pageblock_skip_persistent(page))
1065 return false;
1066
1064 if ((cc->mode != MIGRATE_ASYNC) || !cc->direct_compaction) 1067 if ((cc->mode != MIGRATE_ASYNC) || !cc->direct_compaction)
1065 return true; 1068 return true;
1066 1069
@@ -1697,12 +1700,17 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone,
1697 continue; 1700 continue;
1698 1701
1699 /* 1702 /*
1700 * For async compaction, also only scan in MOVABLE blocks. 1703 * For async compaction, also only scan in MOVABLE blocks
1701 * Async compaction is optimistic to see if the minimum amount 1704 * without huge pages. Async compaction is optimistic to see
1702 * of work satisfies the allocation. 1705 * if the minimum amount of work satisfies the allocation.
1706 * The cached PFN is updated as it's possible that all
1707 * remaining blocks between source and target are unsuitable
1708 * and the compaction scanners fail to meet.
1703 */ 1709 */
1704 if (!suitable_migration_source(cc, page)) 1710 if (!suitable_migration_source(cc, page)) {
1711 update_cached_migrate(cc, block_end_pfn);
1705 continue; 1712 continue;
1713 }
1706 1714
1707 /* Perform the isolation */ 1715 /* Perform the isolation */
1708 low_pfn = isolate_migratepages_block(cc, low_pfn, 1716 low_pfn = isolate_migratepages_block(cc, low_pfn,