diff options
-rw-r--r-- | mm/vmscan.c | 43 |
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 | */ |
2604 | static inline bool compaction_ready(struct zone *zone, struct scan_control *sc) | 2605 | static 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 | /* |