aboutsummaryrefslogtreecommitdiffstats
path: root/mm/compaction.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/compaction.c')
-rw-r--r--mm/compaction.c14
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.