diff options
Diffstat (limited to 'mm/compaction.c')
-rw-r--r-- | mm/compaction.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/mm/compaction.c b/mm/compaction.c index b2b94474dd28..4af1577adb5c 100644 --- a/mm/compaction.c +++ b/mm/compaction.c | |||
@@ -1252,7 +1252,10 @@ static enum compact_result __compact_finished(struct zone *zone, struct compact_ | |||
1252 | if (cc->direct_compaction) | 1252 | if (cc->direct_compaction) |
1253 | zone->compact_blockskip_flush = true; | 1253 | zone->compact_blockskip_flush = true; |
1254 | 1254 | ||
1255 | return COMPACT_COMPLETE; | 1255 | if (cc->whole_zone) |
1256 | return COMPACT_COMPLETE; | ||
1257 | else | ||
1258 | return COMPACT_PARTIAL_SKIPPED; | ||
1256 | } | 1259 | } |
1257 | 1260 | ||
1258 | if (is_via_compact_memory(cc->order)) | 1261 | if (is_via_compact_memory(cc->order)) |
@@ -1413,6 +1416,10 @@ static enum compact_result compact_zone(struct zone *zone, struct compact_contro | |||
1413 | zone->compact_cached_migrate_pfn[0] = cc->migrate_pfn; | 1416 | zone->compact_cached_migrate_pfn[0] = cc->migrate_pfn; |
1414 | zone->compact_cached_migrate_pfn[1] = cc->migrate_pfn; | 1417 | zone->compact_cached_migrate_pfn[1] = cc->migrate_pfn; |
1415 | } | 1418 | } |
1419 | |||
1420 | if (cc->migrate_pfn == start_pfn) | ||
1421 | cc->whole_zone = true; | ||
1422 | |||
1416 | cc->last_migrated_pfn = 0; | 1423 | cc->last_migrated_pfn = 0; |
1417 | 1424 | ||
1418 | trace_mm_compaction_begin(start_pfn, cc->migrate_pfn, | 1425 | trace_mm_compaction_begin(start_pfn, cc->migrate_pfn, |
@@ -1634,7 +1641,8 @@ enum compact_result try_to_compact_pages(gfp_t gfp_mask, unsigned int order, | |||
1634 | goto break_loop; | 1641 | goto break_loop; |
1635 | } | 1642 | } |
1636 | 1643 | ||
1637 | if (mode != MIGRATE_ASYNC && status == COMPACT_COMPLETE) { | 1644 | if (mode != MIGRATE_ASYNC && (status == COMPACT_COMPLETE || |
1645 | status == COMPACT_PARTIAL_SKIPPED)) { | ||
1638 | /* | 1646 | /* |
1639 | * We think that allocation won't succeed in this zone | 1647 | * We think that allocation won't succeed in this zone |
1640 | * so we defer compaction there. If it ends up | 1648 | * so we defer compaction there. If it ends up |
@@ -1881,7 +1889,7 @@ static void kcompactd_do_work(pg_data_t *pgdat) | |||
1881 | cc.classzone_idx, 0)) { | 1889 | cc.classzone_idx, 0)) { |
1882 | success = true; | 1890 | success = true; |
1883 | compaction_defer_reset(zone, cc.order, false); | 1891 | compaction_defer_reset(zone, cc.order, false); |
1884 | } else if (status == COMPACT_COMPLETE) { | 1892 | } else if (status == COMPACT_PARTIAL_SKIPPED || status == COMPACT_COMPLETE) { |
1885 | /* | 1893 | /* |
1886 | * We use sync migration mode here, so we defer like | 1894 | * We use sync migration mode here, so we defer like |
1887 | * sync direct compaction does. | 1895 | * sync direct compaction does. |