@@ -260,9 +260,9 @@ static struct super_block *alloc_super(struct fs_context *fc)
s->s_shrink.flags = SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE;
if (prealloc_shrinker(&s->s_shrink))
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;
- if (list_lru_init_memcg(&s->s_inode_lru))
+ if (list_lru_init_memcg(&s->s_inode_lru, &s->s_shrink))
goto fail;
return s;
@@ -54,19 +54,20 @@ struct list_lru {
bool lock_irq;
#ifdef CONFIG_MEMCG_KMEM
struct list_head list;
+ int shrinker_id;
#endif
};
void list_lru_destroy(struct list_lru *lru);
int __list_lru_init(struct list_lru *lru, bool memcg_aware, bool lock_irq,
- struct lock_class_key *key);
-
-#define list_lru_init(lru) __list_lru_init((lru), false, false, \
- NULL)
-#define list_lru_init_key(lru, key) __list_lru_init((lru), false, false, \
- (key))
-#define list_lru_init_memcg(lru) __list_lru_init((lru), true, false, \
- NULL)
+ struct lock_class_key *key, struct shrinker *shrinker);
+
+#define list_lru_init(lru) \
+ __list_lru_init((lru), false, false, NULL, NULL)
+#define list_lru_init_key(lru, key) \
+ __list_lru_init((lru), false, false, (key), NULL)
+#define list_lru_init_memcg(lru, shrinker) \
+ __list_lru_init((lru), true, false, NULL, shrinker)
int memcg_update_all_list_lrus(int num_memcgs);
void memcg_drain_all_list_lrus(int src_idx, int dst_idx);
@@ -559,12 +559,18 @@ static void memcg_destroy_list_lru(struct list_lru *lru)
#endif /* CONFIG_MEMCG_KMEM */
int __list_lru_init(struct list_lru *lru, bool memcg_aware, bool lock_irq,
- struct lock_class_key *key)
+ struct lock_class_key *key, struct shrinker *shrinker)
{
int i;
size_t size = sizeof(*lru->node) * nr_node_ids;
int err = -ENOMEM;
+#ifdef CONFIG_MEMCG_KMEM
+ if (shrinker)
+ lru->shrinker_id = shrinker->id;
+ else
+ lru->shrinker_id = -1;
+#endif
memcg_get_cache_ids();
lru->node = kzalloc(size, GFP_KERNEL);
@@ -607,6 +613,9 @@ void list_lru_destroy(struct list_lru *lru)
kfree(lru->node);
lru->node = NULL;
+#ifdef CONFIG_MEMCG_KMEM
+ lru->shrinker_id = -1;
+#endif
memcg_put_cache_ids();
}
EXPORT_SYMBOL_GPL(list_lru_destroy);
@@ -511,7 +511,8 @@ static int __init workingset_init(void)
if (ret)
goto err;
/* list_lru lock nests inside the IRQ-safe i_pages lock */
- ret = __list_lru_init(&shadow_nodes, true, true, &shadow_nodes_key);
+ ret = __list_lru_init(&shadow_nodes, true, true, &shadow_nodes_key,
+ &workingset_shadow_shrinker);
if (ret)
goto err_list_lru;
register_shrinker_prepared(&workingset_shadow_shrinker);