|
@@ -2459,7 +2459,7 @@ static bool shrink_zone(struct zone *zone, struct scan_control *sc,
|
|
* Returns true if compaction should go ahead for a high-order request, or
|
|
* Returns true if compaction should go ahead for a high-order request, or
|
|
* the high-order allocation would succeed without compaction.
|
|
* the high-order allocation would succeed without compaction.
|
|
*/
|
|
*/
|
|
-static inline bool compaction_ready(struct zone *zone, int order)
|
|
|
|
|
|
+static inline bool compaction_ready(struct zone *zone, int order, int classzone_idx)
|
|
{
|
|
{
|
|
unsigned long balance_gap, watermark;
|
|
unsigned long balance_gap, watermark;
|
|
bool watermark_ok;
|
|
bool watermark_ok;
|
|
@@ -2473,7 +2473,7 @@ static inline bool compaction_ready(struct zone *zone, int order)
|
|
balance_gap = min(low_wmark_pages(zone), DIV_ROUND_UP(
|
|
balance_gap = min(low_wmark_pages(zone), DIV_ROUND_UP(
|
|
zone->managed_pages, KSWAPD_ZONE_BALANCE_GAP_RATIO));
|
|
zone->managed_pages, KSWAPD_ZONE_BALANCE_GAP_RATIO));
|
|
watermark = high_wmark_pages(zone) + balance_gap + (2UL << order);
|
|
watermark = high_wmark_pages(zone) + balance_gap + (2UL << order);
|
|
- watermark_ok = zone_watermark_ok_safe(zone, 0, watermark, 0);
|
|
|
|
|
|
+ watermark_ok = zone_watermark_ok_safe(zone, 0, watermark, classzone_idx);
|
|
|
|
|
|
/*
|
|
/*
|
|
* If compaction is deferred, reclaim up to a point where
|
|
* If compaction is deferred, reclaim up to a point where
|
|
@@ -2486,7 +2486,7 @@ static inline bool compaction_ready(struct zone *zone, int order)
|
|
* If compaction is not ready to start and allocation is not likely
|
|
* If compaction is not ready to start and allocation is not likely
|
|
* to succeed without it, then keep reclaiming.
|
|
* to succeed without it, then keep reclaiming.
|
|
*/
|
|
*/
|
|
- if (compaction_suitable(zone, order, 0, 0) == COMPACT_SKIPPED)
|
|
|
|
|
|
+ if (compaction_suitable(zone, order, 0, classzone_idx) == COMPACT_SKIPPED)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
return watermark_ok;
|
|
return watermark_ok;
|
|
@@ -2566,7 +2566,7 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc)
|
|
if (IS_ENABLED(CONFIG_COMPACTION) &&
|
|
if (IS_ENABLED(CONFIG_COMPACTION) &&
|
|
sc->order > PAGE_ALLOC_COSTLY_ORDER &&
|
|
sc->order > PAGE_ALLOC_COSTLY_ORDER &&
|
|
zonelist_zone_idx(z) <= requested_highidx &&
|
|
zonelist_zone_idx(z) <= requested_highidx &&
|
|
- compaction_ready(zone, sc->order)) {
|
|
|
|
|
|
+ compaction_ready(zone, sc->order, requested_highidx)) {
|
|
sc->compaction_ready = true;
|
|
sc->compaction_ready = true;
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|