mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
mm, vmscan: only wakeup kswapd once per node for the requested classzone
kswapd is woken when zones are below the low watermark but the wakeup decision is not taking the classzone into account. Now that reclaim is node-based, it is only required to wake kswapd once per node and only if all zones are unbalanced for the requested classzone. Note that one node might be checked multiple times if the zonelist is ordered by node because there is no cheap way of tracking what nodes have already been visited. For zone-ordering, each node should be checked only once. Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Mel Gorman <[email protected]> Acked-by: Vlastimil Babka <[email protected]> Cc: Hillf Danton <[email protected]> Acked-by: Johannes Weiner <[email protected]> Cc: Joonsoo Kim <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Minchan Kim <[email protected]> Cc: Rik van Riel <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
c4a25635b6
commit
e1a556374a
2 changed files with 17 additions and 4 deletions
13
mm/vmscan.c
13
mm/vmscan.c
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue