summaryrefslogtreecommitdiffstats
path: root/mm/compaction.c
diff options
context:
space:
mode:
authorVlastimil Babka <vbabka@suse.cz>2016-10-07 19:57:50 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-10-07 21:46:27 -0400
commitf2b8228c5f99a92bc07efd36f8dc840e0705a266 (patch)
tree8c419fac135a6934b8e5a48158f633477e2edd07 /mm/compaction.c
parenta8e025e55b35f7eaf6c6c011de1f98d47ddf0843 (diff)
mm, compaction: use correct watermark when checking compaction success
The __compact_finished() function uses low watermark in a check that has to pass if the direct compaction is to finish and allocation should succeed. This is too pessimistic, as the allocation will typically use min watermark. It may happen that during compaction, we drop below the low watermark (due to parallel activity), but still form the target high-order page. By checking against low watermark, we might needlessly continue compaction. Similarly, __compaction_suitable() uses low watermark in a check whether allocation can succeed without compaction. Again, this is unnecessarily pessimistic. After this patch, these check will use direct compactor's alloc_flags to determine the watermark, which is effectively the min watermark. Link: http://lkml.kernel.org/r/20160810091226.6709-8-vbabka@suse.cz Signed-off-by: Vlastimil Babka <vbabka@suse.cz> Tested-by: Lorenzo Stoakes <lstoakes@gmail.com> Acked-by: Michal Hocko <mhocko@suse.com> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: David Rientjes <rientjes@google.com> Cc: Rik van Riel <riel@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/compaction.c')
-rw-r--r--mm/compaction.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/mm/compaction.c b/mm/compaction.c
index 21040304f4d2..e2618ac062a6 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -1316,7 +1316,7 @@ static enum compact_result __compact_finished(struct zone *zone, struct compact_
1316 return COMPACT_CONTINUE; 1316 return COMPACT_CONTINUE;
1317 1317
1318 /* Compaction run is not finished if the watermark is not met */ 1318 /* Compaction run is not finished if the watermark is not met */
1319 watermark = low_wmark_pages(zone); 1319 watermark = zone->watermark[cc->alloc_flags & ALLOC_WMARK_MASK];
1320 1320
1321 if (!zone_watermark_ok(zone, cc->order, watermark, cc->classzone_idx, 1321 if (!zone_watermark_ok(zone, cc->order, watermark, cc->classzone_idx,
1322 cc->alloc_flags)) 1322 cc->alloc_flags))
@@ -1381,7 +1381,7 @@ static enum compact_result __compaction_suitable(struct zone *zone, int order,
1381 if (is_via_compact_memory(order)) 1381 if (is_via_compact_memory(order))
1382 return COMPACT_CONTINUE; 1382 return COMPACT_CONTINUE;
1383 1383
1384 watermark = low_wmark_pages(zone); 1384 watermark = zone->watermark[alloc_flags & ALLOC_WMARK_MASK];
1385 /* 1385 /*
1386 * If watermarks for high-order allocation are already met, there 1386 * If watermarks for high-order allocation are already met, there
1387 * should be no need for compaction at all. 1387 * should be no need for compaction at all.
@@ -1395,7 +1395,7 @@ static enum compact_result __compaction_suitable(struct zone *zone, int order,
1395 * This is because during migration, copies of pages need to be 1395 * This is because during migration, copies of pages need to be
1396 * allocated and for a short time, the footprint is higher 1396 * allocated and for a short time, the footprint is higher
1397 */ 1397 */
1398 watermark += (2UL << order); 1398 watermark = low_wmark_pages(zone) + (2UL << order);
1399 if (!__zone_watermark_ok(zone, 0, watermark, classzone_idx, 1399 if (!__zone_watermark_ok(zone, 0, watermark, classzone_idx,
1400 alloc_flags, wmark_target)) 1400 alloc_flags, wmark_target))
1401 return COMPACT_SKIPPED; 1401 return COMPACT_SKIPPED;