diff options
author | Vladimir Davydov <vdavydov@parallels.com> | 2014-01-23 18:53:23 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-23 19:36:52 -0500 |
commit | ec97097bca147d5718a5d2c024d1ec740b10096d (patch) | |
tree | 0398f0eb71bf85f8eaaa6712abe6c57589a8c6f7 /mm/vmscan.c | |
parent | 0b1fb40a3b1291f2f12f13f644ac95cf756a00e6 (diff) |
mm: vmscan: call NUMA-unaware shrinkers irrespective of nodemask
If a shrinker is not NUMA-aware, shrink_slab() should call it exactly
once with nid=0, but currently it is not true: if node 0 is not set in
the nodemask or if it is not online, we will not call such shrinkers at
all. As a result some slabs will be left untouched under some
circumstances. Let us fix it.
Signed-off-by: Vladimir Davydov <vdavydov@parallels.com>
Reported-by: Dave Chinner <dchinner@redhat.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Rik van Riel <riel@redhat.com>
Cc: Glauber Costa <glommer@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index 45c1cf61cbed..90c4075d8d75 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -369,16 +369,17 @@ unsigned long shrink_slab(struct shrink_control *shrinkctl, | |||
369 | } | 369 | } |
370 | 370 | ||
371 | list_for_each_entry(shrinker, &shrinker_list, list) { | 371 | list_for_each_entry(shrinker, &shrinker_list, list) { |
372 | for_each_node_mask(shrinkctl->nid, shrinkctl->nodes_to_scan) { | 372 | if (!(shrinker->flags & SHRINKER_NUMA_AWARE)) { |
373 | if (!node_online(shrinkctl->nid)) | 373 | shrinkctl->nid = 0; |
374 | continue; | ||
375 | |||
376 | if (!(shrinker->flags & SHRINKER_NUMA_AWARE) && | ||
377 | (shrinkctl->nid != 0)) | ||
378 | break; | ||
379 | |||
380 | freed += shrink_slab_node(shrinkctl, shrinker, | 374 | freed += shrink_slab_node(shrinkctl, shrinker, |
381 | nr_pages_scanned, lru_pages); | 375 | nr_pages_scanned, lru_pages); |
376 | continue; | ||
377 | } | ||
378 | |||
379 | for_each_node_mask(shrinkctl->nid, shrinkctl->nodes_to_scan) { | ||
380 | if (node_online(shrinkctl->nid)) | ||
381 | freed += shrink_slab_node(shrinkctl, shrinker, | ||
382 | nr_pages_scanned, lru_pages); | ||
382 | 383 | ||
383 | } | 384 | } |
384 | } | 385 | } |