summaryrefslogtreecommitdiffstats
path: root/mm/vmscan.c
diff options
context:
space:
mode:
authorVladimir Davydov <vdavydov.dev@gmail.com>2018-08-17 18:48:17 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-08-17 19:20:31 -0400
commitaeed1d325d429ac9699c4bf62d17156d60905519 (patch)
tree9e9ab4a31d4d326c6cfab4d2998cc315ffd4ba1a /mm/vmscan.c
parentb0dedc49a2daa0f44ddc51fbf686b2ef012fccbf (diff)
mm/vmscan.c: generalize shrink_slab() calls in shrink_node()
The patch makes shrink_slab() be called for root_mem_cgroup in the same way as it's called for the rest of cgroups. This simplifies the logic and improves the readability. [ktkhai@virtuozzo.com: wrote changelog] Link: http://lkml.kernel.org/r/153063068338.1818.11496084754797453962.stgit@localhost.localdomain Signed-off-by: Vladimir Davydov <vdavydov.dev@gmail.com> Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com> Tested-by: Shakeel Butt <shakeelb@google.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Guenter Roeck <linux@roeck-us.net> Cc: "Huang, Ying" <ying.huang@intel.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Josef Bacik <jbacik@fb.com> Cc: Li RongQing <lirongqing@baidu.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: Matthias Kaehlcke <mka@chromium.org> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Michal Hocko <mhocko@kernel.org> Cc: Minchan Kim <minchan@kernel.org> Cc: Philippe Ombredanne <pombredanne@nexb.com> Cc: Roman Gushchin <guro@fb.com> Cc: Sahitya Tummala <stummala@codeaurora.org> Cc: Stephen Rothwell <sfr@canb.auug.org.au> Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Waiman Long <longman@redhat.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.c21
1 files changed, 6 insertions, 15 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index d7a5b8566869..2aa3cb760189 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -627,10 +627,8 @@ static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid,
627 * @nid is passed along to shrinkers with SHRINKER_NUMA_AWARE set, 627 * @nid is passed along to shrinkers with SHRINKER_NUMA_AWARE set,
628 * unaware shrinkers will receive a node id of 0 instead. 628 * unaware shrinkers will receive a node id of 0 instead.
629 * 629 *
630 * @memcg specifies the memory cgroup to target. If it is not NULL, 630 * @memcg specifies the memory cgroup to target. Unaware shrinkers
631 * only shrinkers with SHRINKER_MEMCG_AWARE set will be called to scan 631 * are called only if it is the root cgroup.
632 * objects from the memory cgroup specified. Otherwise, only unaware
633 * shrinkers are called.
634 * 632 *
635 * @priority is sc->priority, we take the number of objects and >> by priority 633 * @priority is sc->priority, we take the number of objects and >> by priority
636 * in order to get the scan target. 634 * in order to get the scan target.
@@ -644,7 +642,7 @@ static unsigned long shrink_slab(gfp_t gfp_mask, int nid,
644 struct shrinker *shrinker; 642 struct shrinker *shrinker;
645 unsigned long freed = 0; 643 unsigned long freed = 0;
646 644
647 if (memcg && !mem_cgroup_is_root(memcg)) 645 if (!mem_cgroup_is_root(memcg))
648 return shrink_slab_memcg(gfp_mask, nid, memcg, priority); 646 return shrink_slab_memcg(gfp_mask, nid, memcg, priority);
649 647
650 if (!down_read_trylock(&shrinker_rwsem)) 648 if (!down_read_trylock(&shrinker_rwsem))
@@ -657,9 +655,6 @@ static unsigned long shrink_slab(gfp_t gfp_mask, int nid,
657 .memcg = memcg, 655 .memcg = memcg,
658 }; 656 };
659 657
660 if (!!memcg != !!(shrinker->flags & SHRINKER_MEMCG_AWARE))
661 continue;
662
663 if (!(shrinker->flags & SHRINKER_NUMA_AWARE)) 658 if (!(shrinker->flags & SHRINKER_NUMA_AWARE))
664 sc.nid = 0; 659 sc.nid = 0;
665 660
@@ -689,6 +684,7 @@ void drop_slab_node(int nid)
689 struct mem_cgroup *memcg = NULL; 684 struct mem_cgroup *memcg = NULL;
690 685
691 freed = 0; 686 freed = 0;
687 memcg = mem_cgroup_iter(NULL, NULL, NULL);
692 do { 688 do {
693 freed += shrink_slab(GFP_KERNEL, nid, memcg, 0); 689 freed += shrink_slab(GFP_KERNEL, nid, memcg, 0);
694 } while ((memcg = mem_cgroup_iter(NULL, memcg, NULL)) != NULL); 690 } while ((memcg = mem_cgroup_iter(NULL, memcg, NULL)) != NULL);
@@ -2708,9 +2704,8 @@ static bool shrink_node(pg_data_t *pgdat, struct scan_control *sc)
2708 shrink_node_memcg(pgdat, memcg, sc, &lru_pages); 2704 shrink_node_memcg(pgdat, memcg, sc, &lru_pages);
2709 node_lru_pages += lru_pages; 2705 node_lru_pages += lru_pages;
2710 2706
2711 if (memcg) 2707 shrink_slab(sc->gfp_mask, pgdat->node_id,
2712 shrink_slab(sc->gfp_mask, pgdat->node_id, 2708 memcg, sc->priority);
2713 memcg, sc->priority);
2714 2709
2715 /* Record the group's reclaim efficiency */ 2710 /* Record the group's reclaim efficiency */
2716 vmpressure(sc->gfp_mask, memcg, false, 2711 vmpressure(sc->gfp_mask, memcg, false,
@@ -2734,10 +2729,6 @@ static bool shrink_node(pg_data_t *pgdat, struct scan_control *sc)
2734 } 2729 }
2735 } while ((memcg = mem_cgroup_iter(root, memcg, &reclaim))); 2730 } while ((memcg = mem_cgroup_iter(root, memcg, &reclaim)));
2736 2731
2737 if (global_reclaim(sc))
2738 shrink_slab(sc->gfp_mask, pgdat->node_id, NULL,
2739 sc->priority);
2740
2741 if (reclaim_state) { 2732 if (reclaim_state) {
2742 sc->nr_reclaimed += reclaim_state->reclaimed_slab; 2733 sc->nr_reclaimed += reclaim_state->reclaimed_slab;
2743 reclaim_state->reclaimed_slab = 0; 2734 reclaim_state->reclaimed_slab = 0;