|
@@ -3421,6 +3421,7 @@ kswapd_try_sleep:
|
|
|
void wakeup_kswapd(struct zone *zone, int order, enum zone_type classzone_idx)
|
|
|
{
|
|
|
pg_data_t *pgdat;
|
|
|
+ int z;
|
|
|
|
|
|
if (!populated_zone(zone))
|
|
|
return;
|
|
@@ -3432,8 +3433,16 @@ void wakeup_kswapd(struct zone *zone, int order, enum zone_type classzone_idx)
|
|
|
pgdat->kswapd_order = max(pgdat->kswapd_order, order);
|
|
|
if (!waitqueue_active(&pgdat->kswapd_wait))
|
|
|
return;
|
|
|
- if (zone_balanced(zone, order, 0))
|
|
|
- return;
|
|
|
+
|
|
|
+ /* Only wake kswapd if all zones are unbalanced */
|
|
|
+ for (z = 0; z <= classzone_idx; z++) {
|
|
|
+ zone = pgdat->node_zones + z;
|
|
|
+ if (!populated_zone(zone))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (zone_balanced(zone, order, classzone_idx))
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
trace_mm_vmscan_wakeup_kswapd(pgdat->node_id, zone_idx(zone), order);
|
|
|
wake_up_interruptible(&pgdat->kswapd_wait);
|