aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKirill Tkhai <ktkhai@virtuozzo.com>2018-08-17 18:47:50 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-08-17 19:20:31 -0400
commitc92e8e10cafeaaedc84f23fed1bfcf9cf07399c2 (patch)
tree5c3f793dbaffe4a5abfddaf74f1c21276e09a1f4
parent2b3648a6ff83bd2a59b427d3537cc570933659b5 (diff)
fs: propagate shrinker::id to list_lru
Add list_lru::shrinker_id field and populate it by registered shrinker id. This will be used to set correct bit in memcg shrinkers map by lru code in next patches, after there appeared the first related to memcg element in list_lru. Link: http://lkml.kernel.org/r/153063059758.1818.14866596416857717800.stgit@localhost.localdomain Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com> Acked-by: Vladimir Davydov <vdavydov.dev@gmail.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>
-rw-r--r--fs/super.c4
-rw-r--r--include/linux/list_lru.h14
-rw-r--r--mm/list_lru.c11
-rw-r--r--mm/workingset.c3
4 files changed, 23 insertions, 9 deletions
diff --git a/fs/super.c b/fs/super.c
index 78227c4ddb21..f5f96e52e0cd 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -261,9 +261,9 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags,
261 s->s_shrink.flags = SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE; 261 s->s_shrink.flags = SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE;
262 if (prealloc_shrinker(&s->s_shrink)) 262 if (prealloc_shrinker(&s->s_shrink))
263 goto fail; 263 goto fail;
264 if (list_lru_init_memcg(&s->s_dentry_lru)) 264 if (list_lru_init_memcg(&s->s_dentry_lru, &s->s_shrink))
265 goto fail; 265 goto fail;
266 if (list_lru_init_memcg(&s->s_inode_lru)) 266 if (list_lru_init_memcg(&s->s_inode_lru, &s->s_shrink))
267 goto fail; 267 goto fail;
268 return s; 268 return s;
269 269
diff --git a/include/linux/list_lru.h b/include/linux/list_lru.h
index 2d23b5b745be..9e75bb33766b 100644
--- a/include/linux/list_lru.h
+++ b/include/linux/list_lru.h
@@ -53,16 +53,20 @@ struct list_lru {
53 struct list_lru_node *node; 53 struct list_lru_node *node;
54#ifdef CONFIG_MEMCG_KMEM 54#ifdef CONFIG_MEMCG_KMEM
55 struct list_head list; 55 struct list_head list;
56 int shrinker_id;
56#endif 57#endif
57}; 58};
58 59
59void list_lru_destroy(struct list_lru *lru); 60void list_lru_destroy(struct list_lru *lru);
60int __list_lru_init(struct list_lru *lru, bool memcg_aware, 61int __list_lru_init(struct list_lru *lru, bool memcg_aware,
61 struct lock_class_key *key); 62 struct lock_class_key *key, struct shrinker *shrinker);
62 63
63#define list_lru_init(lru) __list_lru_init((lru), false, NULL) 64#define list_lru_init(lru) \
64#define list_lru_init_key(lru, key) __list_lru_init((lru), false, (key)) 65 __list_lru_init((lru), false, NULL, NULL)
65#define list_lru_init_memcg(lru) __list_lru_init((lru), true, NULL) 66#define list_lru_init_key(lru, key) \
67 __list_lru_init((lru), false, (key), NULL)
68#define list_lru_init_memcg(lru, shrinker) \
69 __list_lru_init((lru), true, NULL, shrinker)
66 70
67int memcg_update_all_list_lrus(int num_memcgs); 71int memcg_update_all_list_lrus(int num_memcgs);
68void memcg_drain_all_list_lrus(int src_idx, int dst_idx); 72void memcg_drain_all_list_lrus(int src_idx, int dst_idx);
diff --git a/mm/list_lru.c b/mm/list_lru.c
index c5217d84c6e1..5aebbb9b2f5b 100644
--- a/mm/list_lru.c
+++ b/mm/list_lru.c
@@ -546,12 +546,18 @@ static void memcg_destroy_list_lru(struct list_lru *lru)
546#endif /* CONFIG_MEMCG_KMEM */ 546#endif /* CONFIG_MEMCG_KMEM */
547 547
548int __list_lru_init(struct list_lru *lru, bool memcg_aware, 548int __list_lru_init(struct list_lru *lru, bool memcg_aware,
549 struct lock_class_key *key) 549 struct lock_class_key *key, struct shrinker *shrinker)
550{ 550{
551 int i; 551 int i;
552 size_t size = sizeof(*lru->node) * nr_node_ids; 552 size_t size = sizeof(*lru->node) * nr_node_ids;
553 int err = -ENOMEM; 553 int err = -ENOMEM;
554 554
555#ifdef CONFIG_MEMCG_KMEM
556 if (shrinker)
557 lru->shrinker_id = shrinker->id;
558 else
559 lru->shrinker_id = -1;
560#endif
555 memcg_get_cache_ids(); 561 memcg_get_cache_ids();
556 562
557 lru->node = kzalloc(size, GFP_KERNEL); 563 lru->node = kzalloc(size, GFP_KERNEL);
@@ -594,6 +600,9 @@ void list_lru_destroy(struct list_lru *lru)
594 kfree(lru->node); 600 kfree(lru->node);
595 lru->node = NULL; 601 lru->node = NULL;
596 602
603#ifdef CONFIG_MEMCG_KMEM
604 lru->shrinker_id = -1;
605#endif
597 memcg_put_cache_ids(); 606 memcg_put_cache_ids();
598} 607}
599EXPORT_SYMBOL_GPL(list_lru_destroy); 608EXPORT_SYMBOL_GPL(list_lru_destroy);
diff --git a/mm/workingset.c b/mm/workingset.c
index 4e0b2523aae2..cd0b2ae615e4 100644
--- a/mm/workingset.c
+++ b/mm/workingset.c
@@ -526,7 +526,8 @@ static int __init workingset_init(void)
526 ret = prealloc_shrinker(&workingset_shadow_shrinker); 526 ret = prealloc_shrinker(&workingset_shadow_shrinker);
527 if (ret) 527 if (ret)
528 goto err; 528 goto err;
529 ret = __list_lru_init(&shadow_nodes, true, &shadow_nodes_key); 529 ret = __list_lru_init(&shadow_nodes, true, &shadow_nodes_key,
530 &workingset_shadow_shrinker);
530 if (ret) 531 if (ret)
531 goto err_list_lru; 532 goto err_list_lru;
532 register_shrinker_prepared(&workingset_shadow_shrinker); 533 register_shrinker_prepared(&workingset_shadow_shrinker);