Commit c92e8e10 authored by Kirill Tkhai's avatar Kirill Tkhai Committed by Linus Torvalds

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.localdomainSigned-off-by: default avatarKirill Tkhai <ktkhai@virtuozzo.com>
Acked-by: default avatarVladimir Davydov <vdavydov.dev@gmail.com>
Tested-by: default avatarShakeel 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 2b3648a6
...@@ -261,9 +261,9 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags, ...@@ -261,9 +261,9 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags,
s->s_shrink.flags = SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE; s->s_shrink.flags = SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE;
if (prealloc_shrinker(&s->s_shrink)) if (prealloc_shrinker(&s->s_shrink))
goto fail; goto fail;
if (list_lru_init_memcg(&s->s_dentry_lru)) if (list_lru_init_memcg(&s->s_dentry_lru, &s->s_shrink))
goto fail; goto fail;
if (list_lru_init_memcg(&s->s_inode_lru)) if (list_lru_init_memcg(&s->s_inode_lru, &s->s_shrink))
goto fail; goto fail;
return s; return s;
......
...@@ -53,16 +53,20 @@ struct list_lru { ...@@ -53,16 +53,20 @@ struct list_lru {
struct list_lru_node *node; struct list_lru_node *node;
#ifdef CONFIG_MEMCG_KMEM #ifdef CONFIG_MEMCG_KMEM
struct list_head list; struct list_head list;
int shrinker_id;
#endif #endif
}; };
void list_lru_destroy(struct list_lru *lru); void list_lru_destroy(struct list_lru *lru);
int __list_lru_init(struct list_lru *lru, bool memcg_aware, int __list_lru_init(struct list_lru *lru, bool memcg_aware,
struct lock_class_key *key); struct lock_class_key *key, struct shrinker *shrinker);
#define list_lru_init(lru) __list_lru_init((lru), false, NULL) #define list_lru_init(lru) \
#define list_lru_init_key(lru, key) __list_lru_init((lru), false, (key)) __list_lru_init((lru), false, NULL, NULL)
#define list_lru_init_memcg(lru) __list_lru_init((lru), true, NULL) #define list_lru_init_key(lru, key) \
__list_lru_init((lru), false, (key), NULL)
#define list_lru_init_memcg(lru, shrinker) \
__list_lru_init((lru), true, NULL, shrinker)
int memcg_update_all_list_lrus(int num_memcgs); int memcg_update_all_list_lrus(int num_memcgs);
void memcg_drain_all_list_lrus(int src_idx, int dst_idx); void memcg_drain_all_list_lrus(int src_idx, int dst_idx);
......
...@@ -546,12 +546,18 @@ static void memcg_destroy_list_lru(struct list_lru *lru) ...@@ -546,12 +546,18 @@ static void memcg_destroy_list_lru(struct list_lru *lru)
#endif /* CONFIG_MEMCG_KMEM */ #endif /* CONFIG_MEMCG_KMEM */
int __list_lru_init(struct list_lru *lru, bool memcg_aware, int __list_lru_init(struct list_lru *lru, bool memcg_aware,
struct lock_class_key *key) struct lock_class_key *key, struct shrinker *shrinker)
{ {
int i; int i;
size_t size = sizeof(*lru->node) * nr_node_ids; size_t size = sizeof(*lru->node) * nr_node_ids;
int err = -ENOMEM; int err = -ENOMEM;
#ifdef CONFIG_MEMCG_KMEM
if (shrinker)
lru->shrinker_id = shrinker->id;
else
lru->shrinker_id = -1;
#endif
memcg_get_cache_ids(); memcg_get_cache_ids();
lru->node = kzalloc(size, GFP_KERNEL); lru->node = kzalloc(size, GFP_KERNEL);
...@@ -594,6 +600,9 @@ void list_lru_destroy(struct list_lru *lru) ...@@ -594,6 +600,9 @@ void list_lru_destroy(struct list_lru *lru)
kfree(lru->node); kfree(lru->node);
lru->node = NULL; lru->node = NULL;
#ifdef CONFIG_MEMCG_KMEM
lru->shrinker_id = -1;
#endif
memcg_put_cache_ids(); memcg_put_cache_ids();
} }
EXPORT_SYMBOL_GPL(list_lru_destroy); EXPORT_SYMBOL_GPL(list_lru_destroy);
...@@ -526,7 +526,8 @@ static int __init workingset_init(void) ...@@ -526,7 +526,8 @@ static int __init workingset_init(void)
ret = prealloc_shrinker(&workingset_shadow_shrinker); ret = prealloc_shrinker(&workingset_shadow_shrinker);
if (ret) if (ret)
goto err; goto err;
ret = __list_lru_init(&shadow_nodes, true, &shadow_nodes_key); ret = __list_lru_init(&shadow_nodes, true, &shadow_nodes_key,
&workingset_shadow_shrinker);
if (ret) if (ret)
goto err_list_lru; goto err_list_lru;
register_shrinker_prepared(&workingset_shadow_shrinker); register_shrinker_prepared(&workingset_shadow_shrinker);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment