|
@@ -2598,38 +2598,35 @@ static bool shrink_node(pg_data_t *pgdat, struct scan_control *sc)
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Returns true if compaction should go ahead for a high-order request, or
|
|
|
- * the high-order allocation would succeed without compaction.
|
|
|
+ * Returns true if compaction should go ahead for a costly-order request, or
|
|
|
+ * the allocation would already succeed without compaction. Return false if we
|
|
|
+ * should reclaim first.
|
|
|
*/
|
|
|
static inline bool compaction_ready(struct zone *zone, struct scan_control *sc)
|
|
|
{
|
|
|
unsigned long watermark;
|
|
|
- bool watermark_ok;
|
|
|
+ enum compact_result suitable;
|
|
|
|
|
|
- /*
|
|
|
- * Compaction takes time to run and there are potentially other
|
|
|
- * callers using the pages just freed. Continue reclaiming until
|
|
|
- * there is a buffer of free pages available to give compaction
|
|
|
- * a reasonable chance of completing and allocating the page
|
|
|
- */
|
|
|
- watermark = high_wmark_pages(zone) + compact_gap(sc->order);
|
|
|
- watermark_ok = zone_watermark_ok_safe(zone, 0, watermark, sc->reclaim_idx);
|
|
|
-
|
|
|
- /*
|
|
|
- * If compaction is deferred, reclaim up to a point where
|
|
|
- * compaction will have a chance of success when re-enabled
|
|
|
- */
|
|
|
- if (compaction_deferred(zone, sc->order))
|
|
|
- return watermark_ok;
|
|
|
+ suitable = compaction_suitable(zone, sc->order, 0, sc->reclaim_idx);
|
|
|
+ if (suitable == COMPACT_SUCCESS)
|
|
|
+ /* Allocation should succeed already. Don't reclaim. */
|
|
|
+ return true;
|
|
|
+ if (suitable == COMPACT_SKIPPED)
|
|
|
+ /* Compaction cannot yet proceed. Do reclaim. */
|
|
|
+ return false;
|
|
|
|
|
|
/*
|
|
|
- * If compaction is not ready to start and allocation is not likely
|
|
|
- * to succeed without it, then keep reclaiming.
|
|
|
+ * Compaction is already possible, but it takes time to run and there
|
|
|
+ * are potentially other callers using the pages just freed. So proceed
|
|
|
+ * with reclaim to make a buffer of free pages available to give
|
|
|
+ * compaction a reasonable chance of completing and allocating the page.
|
|
|
+ * Note that we won't actually reclaim the whole buffer in one attempt
|
|
|
+ * as the target watermark in should_continue_reclaim() is lower. But if
|
|
|
+ * we are already above the high+gap watermark, don't reclaim at all.
|
|
|
*/
|
|
|
- if (compaction_suitable(zone, sc->order, 0, sc->reclaim_idx) == COMPACT_SKIPPED)
|
|
|
- return false;
|
|
|
+ watermark = high_wmark_pages(zone) + compact_gap(sc->order);
|
|
|
|
|
|
- return watermark_ok;
|
|
|
+ return zone_watermark_ok_safe(zone, 0, watermark, sc->reclaim_idx);
|
|
|
}
|
|
|
|
|
|
/*
|