aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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/*