mm: kswapd: reset kswapd_max_order and classzone_idx after reading
When kswapd wakes up, it reads its order and classzone from pgdat and calls balance_pgdat. While its awake, it potentially reclaimes at a high order and a low classzone index. This might have been a once-off that was not required by subsequent callers. However, because the pgdat values were not reset, they remain artifically high while balance_pgdat() is running and potentially kswapd enters a second unnecessary reclaim cycle. Reset the pgdat order and classzone index after reading. Signed-off-by: Mel Gorman <mel@csn.ul.ie> Reviewed-by: Minchan Kim <minchan.kim@gmail.com> Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Reviewed-by: Eric B Munson <emunson@mgebm.net> Cc: Simon Kirby <sim@hostway.ca> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Shaohua Li <shaohua.li@intel.com> Cc: Dave Hansen <dave@linux.vnet.ibm.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Rik van Riel <riel@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
0abdee2bd4
commit
4d40502ea5
|
@ -2653,6 +2653,8 @@ static int kswapd(void *p)
|
||||||
kswapd_try_to_sleep(pgdat, order);
|
kswapd_try_to_sleep(pgdat, order);
|
||||||
order = pgdat->kswapd_max_order;
|
order = pgdat->kswapd_max_order;
|
||||||
classzone_idx = pgdat->classzone_idx;
|
classzone_idx = pgdat->classzone_idx;
|
||||||
|
pgdat->kswapd_max_order = 0;
|
||||||
|
pgdat->classzone_idx = MAX_NR_ZONES - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = try_to_freeze();
|
ret = try_to_freeze();
|
||||||
|
|
Loading…
Reference in New Issue