summaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
authorMel Gorman <mgorman@techsingularity.net>2016-07-28 18:46:26 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-07-28 19:07:41 -0400
commite1a556374abc0dbcc3815ba9b5a1ac2a082f23d9 (patch)
treeba381015cdde7722351d4a15f6f07e8278654cd0 /mm/page_alloc.c
parentc4a25635b60d08853a3e4eaae3ab34419a36cfa2 (diff)
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/1467970510-21195-22-git-send-email-mgorman@techsingularity.net Signed-off-by: Mel Gorman <mgorman@techsingularity.net> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Hillf Danton <hillf.zj@alibaba-inc.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Michal Hocko <mhocko@kernel.org> Cc: Minchan Kim <minchan@kernel.org> Cc: Rik van Riel <riel@surriel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 0f92e04b58db..a34d9fcf1339 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -3367,10 +3367,14 @@ static void wake_all_kswapds(unsigned int order, const struct alloc_context *ac)
3367{ 3367{
3368 struct zoneref *z; 3368 struct zoneref *z;
3369 struct zone *zone; 3369 struct zone *zone;
3370 pg_data_t *last_pgdat = NULL;
3370 3371
3371 for_each_zone_zonelist_nodemask(zone, z, ac->zonelist, 3372 for_each_zone_zonelist_nodemask(zone, z, ac->zonelist,
3372 ac->high_zoneidx, ac->nodemask) 3373 ac->high_zoneidx, ac->nodemask) {
3373 wakeup_kswapd(zone, order, ac_classzone_idx(ac)); 3374 if (last_pgdat != zone->zone_pgdat)
3375 wakeup_kswapd(zone, order, ac_classzone_idx(ac));
3376 last_pgdat = zone->zone_pgdat;
3377 }
3374} 3378}
3375 3379
3376static inline unsigned int 3380static inline unsigned int