aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVlastimil Babka <vbabka@suse.cz>2016-10-07 19:58:03 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-10-07 21:46:27 -0400
commitfdd4c6149a71ff1da98317adb6f18c28f75a6e3f (patch)
treee1e1987c0cee0d8cd71ea71c8a0bfbd73b0d0a8a
parent8348faf91f56371d4bada6fc5915e19580a15ffe (diff)
mm, vmscan: make compaction_ready() more accurate and readable
The compaction_ready() is used during direct reclaim for costly order allocations to skip reclaim for zones where compaction should be attempted instead. It's combining the standard compaction_suitable() check with its own watermark check based on high watermark with extra gap, and the result is confusing at best. This patch attempts to better structure and document the checks involved. First, compaction_suitable() can determine that the allocation should either succeed already, or that compaction doesn't have enough free pages to proceed. The third possibility is that compaction has enough free pages, but we still decide to reclaim first - unless we are already above the high watermark with gap. This does not mean that the reclaim will actually reach this watermark during single attempt, this is rather an over-reclaim protection. So document the code as such. The check for compaction_deferred() is removed completely, as it in fact had no proper role here. The result after this patch is mainly a less confusing code. We also skip some over-reclaim in cases where the allocation should already succed. Link: http://lkml.kernel.org/r/20160810091226.6709-12-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>
-rw-r--r--mm/vmscan.c43
1 files changed, 20 insertions, 23 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 2a6978a07d56..f406e6fbaaa5 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2598,38 +2598,35 @@ static bool shrink_node(pg_data_t *pgdat, struct scan_control *sc)
2598} 2598}
2599 2599
2600/* 2600/*
2601 * Returns true if compaction should go ahead for a high-order request, or 2601 * Returns true if compaction should go ahead for a costly-order request, or
2602 * the high-order allocation would succeed without compaction. 2602 * the allocation would already succeed without compaction. Return false if we
2603 * should reclaim first.
2603 */ 2604 */
2604static inline bool compaction_ready(struct zone *zone, struct scan_control *sc) 2605static inline bool compaction_ready(struct zone *zone, struct scan_control *sc)
2605{ 2606{
2606 unsigned long watermark; 2607 unsigned long watermark;
2607 bool watermark_ok; 2608 enum compact_result suitable;
2608 2609
2609 /* 2610 suitable = compaction_suitable(zone, sc->order, 0, sc->reclaim_idx);
2610 * Compaction takes time to run and there are potentially other 2611 if (suitable == COMPACT_SUCCESS)
2611 * callers using the pages just freed. Continue reclaiming until 2612 /* Allocation should succeed already. Don't reclaim. */
2612 * there is a buffer of free pages available to give compaction 2613 return true;
2613 * a reasonable chance of completing and allocating the page 2614 if (suitable == COMPACT_SKIPPED)
2614 */ 2615 /* Compaction cannot yet proceed. Do reclaim. */
2615 watermark = high_wmark_pages(zone) + compact_gap(sc->order); 2616 return false;
2616 watermark_ok = zone_watermark_ok_safe(zone, 0, watermark, sc->reclaim_idx);
2617
2618 /*
2619 * If compaction is deferred, reclaim up to a point where
2620 * compaction will have a chance of success when re-enabled
2621 */
2622 if (compaction_deferred(zone, sc->order))
2623 return watermark_ok;
2624 2617
2625 /* 2618 /*
2626 * If compaction is not ready to start and allocation is not likely 2619 * Compaction is already possible, but it takes time to run and there
2627 * to succeed without it, then keep reclaiming. 2620 * are potentially other callers using the pages just freed. So proceed
2621 * with reclaim to make a buffer of free pages available to give
2622 * compaction a reasonable chance of completing and allocating the page.
2623 * Note that we won't actually reclaim the whole buffer in one attempt
2624 * as the target watermark in should_continue_reclaim() is lower. But if
2625 * we are already above the high+gap watermark, don't reclaim at all.
2628 */ 2626 */
2629 if (compaction_suitable(zone, sc->order, 0, sc->reclaim_idx) == COMPACT_SKIPPED) 2627 watermark = high_wmark_pages(zone) + compact_gap(sc->order);
2630 return false;
2631 2628
2632 return watermark_ok; 2629 return zone_watermark_ok_safe(zone, 0, watermark, sc->reclaim_idx);
2633} 2630}
2634 2631
2635/* 2632/*