summaryrefslogtreecommitdiffstats
path: root/mm/compaction.c
diff options
context:
space:
mode:
authorVlastimil Babka <vbabka@suse.cz>2016-10-07 19:58:00 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-10-07 21:46:27 -0400
commit8348faf91f56371d4bada6fc5915e19580a15ffe (patch)
tree4023e17d61c7607c09aaa17261483019003f6eed /mm/compaction.c
parent984fdba6a32e4e9819ebc06ca3acec6582ffd99f (diff)
mm, compaction: require only min watermarks for non-costly orders
The __compaction_suitable() function checks the low watermark plus a compact_gap() gap to decide if there's enough free memory to perform compaction. Then __isolate_free_page uses low watermark check to decide if particular free page can be isolated. In the latter case, using low watermark is needlessly pessimistic, as the free page isolations are only temporary. For __compaction_suitable() the higher watermark makes sense for high-order allocations where more freepages increase the chance of success, and we can typically fail with some order-0 fallback when the system is struggling to reach that watermark. But for low-order allocation, forming the page should not be that hard. So using low watermark here might just prevent compaction from even trying, and eventually lead to OOM killer even if we are above min watermarks. So after this patch, we use min watermark for non-costly orders in __compaction_suitable(), and for all orders in __isolate_free_page(). [vbabka@suse.cz: clarify __isolate_free_page() comment] Link: http://lkml.kernel.org/r/7ae4baec-4eca-e70b-2a69-94bea4fb19fa@suse.cz Link: http://lkml.kernel.org/r/20160810091226.6709-11-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: Vlastimil Babka <vbabka@suse.cz> Tested-by: Lorenzo Stoakes <lstoakes@gmail.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, 5 insertions, 1 deletions
diff --git a/mm/compaction.c b/mm/compaction.c
index 658c009d60cc..29f6c49dc9c2 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -1399,10 +1399,14 @@ static enum compact_result __compaction_suitable(struct zone *zone, int order,
1399 * isolation. We however do use the direct compactor's classzone_idx to 1399 * isolation. We however do use the direct compactor's classzone_idx to
1400 * skip over zones where lowmem reserves would prevent allocation even 1400 * skip over zones where lowmem reserves would prevent allocation even
1401 * if compaction succeeds. 1401 * if compaction succeeds.
1402 * For costly orders, we require low watermark instead of min for
1403 * compaction to proceed to increase its chances.
1402 * ALLOC_CMA is used, as pages in CMA pageblocks are considered 1404 * ALLOC_CMA is used, as pages in CMA pageblocks are considered
1403 * suitable migration targets 1405 * suitable migration targets
1404 */ 1406 */
1405 watermark = low_wmark_pages(zone) + compact_gap(order); 1407 watermark = (order > PAGE_ALLOC_COSTLY_ORDER) ?
1408 low_wmark_pages(zone) : min_wmark_pages(zone);
1409 watermark += compact_gap(order);
1406 if (!__zone_watermark_ok(zone, 0, watermark, classzone_idx, 1410 if (!__zone_watermark_ok(zone, 0, watermark, classzone_idx,
1407 ALLOC_CMA, wmark_target)) 1411 ALLOC_CMA, wmark_target))
1408 return COMPACT_SKIPPED; 1412 return COMPACT_SKIPPED;