diff options
-rw-r--r-- | mm/compaction.c | 16 |
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, |