|
@@ -2399,6 +2399,7 @@ loop_again:
|
|
|
for (i = 0; i <= end_zone; i++) {
|
|
|
struct zone *zone = pgdat->node_zones + i;
|
|
|
int nr_slab;
|
|
|
+ unsigned long balance_gap;
|
|
|
|
|
|
if (!populated_zone(zone))
|
|
|
continue;
|
|
@@ -2415,11 +2416,20 @@ loop_again:
|
|
|
mem_cgroup_soft_limit_reclaim(zone, order, sc.gfp_mask);
|
|
|
|
|
|
/*
|
|
|
- * We put equal pressure on every zone, unless one
|
|
|
- * zone has way too many pages free already.
|
|
|
+ * We put equal pressure on every zone, unless
|
|
|
+ * one zone has way too many pages free
|
|
|
+ * already. The "too many pages" is defined
|
|
|
+ * as the high wmark plus a "gap" where the
|
|
|
+ * gap is either the low watermark or 1%
|
|
|
+ * of the zone, whichever is smaller.
|
|
|
*/
|
|
|
+ balance_gap = min(low_wmark_pages(zone),
|
|
|
+ (zone->present_pages +
|
|
|
+ KSWAPD_ZONE_BALANCE_GAP_RATIO-1) /
|
|
|
+ KSWAPD_ZONE_BALANCE_GAP_RATIO);
|
|
|
if (!zone_watermark_ok_safe(zone, order,
|
|
|
- 8*high_wmark_pages(zone), end_zone, 0))
|
|
|
+ high_wmark_pages(zone) + balance_gap,
|
|
|
+ end_zone, 0))
|
|
|
shrink_zone(priority, zone, &sc);
|
|
|
reclaim_state->reclaimed_slab = 0;
|
|
|
nr_slab = shrink_slab(sc.nr_scanned, GFP_KERNEL,
|