Commit 7f7ab336 authored by Qi Zheng's avatar Qi Zheng Committed by Trond Myklebust

NFSv4.2: fix wrong shrinker_id

Currently, the list_lru::shrinker_id corresponding to the nfs4_xattr
shrinkers is wrong:

>>> prog["nfs4_xattr_cache_lru"].shrinker_id
(int)0
>>> prog["nfs4_xattr_entry_lru"].shrinker_id
(int)0
>>> prog["nfs4_xattr_large_entry_lru"].shrinker_id
(int)0
>>> prog["nfs4_xattr_cache_shrinker"].id
(int)18
>>> prog["nfs4_xattr_entry_shrinker"].id
(int)19
>>> prog["nfs4_xattr_large_entry_shrinker"].id
(int)20

This is not what we expect, which will cause these shrinkers
not to be found in shrink_slab_memcg().

We should assign shrinker::id before calling list_lru_init_memcg(),
so that the corresponding list_lru::shrinker_id will be assigned
the correct value like below:

>>> prog["nfs4_xattr_cache_lru"].shrinker_id
(int)16
>>> prog["nfs4_xattr_entry_lru"].shrinker_id
(int)17
>>> prog["nfs4_xattr_large_entry_lru"].shrinker_id
(int)18
>>> prog["nfs4_xattr_cache_shrinker"].id
(int)16
>>> prog["nfs4_xattr_entry_shrinker"].id
(int)17
>>> prog["nfs4_xattr_large_entry_shrinker"].id
(int)18

So just do it.

Fixes: 95ad37f9 ("NFSv4.2: add client side xattr caching.")
Signed-off-by: default avatarQi Zheng <zhengqi.arch@bytedance.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 6ad477a6
...@@ -991,6 +991,29 @@ static void nfs4_xattr_cache_init_once(void *p) ...@@ -991,6 +991,29 @@ static void nfs4_xattr_cache_init_once(void *p)
INIT_LIST_HEAD(&cache->dispose); INIT_LIST_HEAD(&cache->dispose);
} }
static int nfs4_xattr_shrinker_init(struct shrinker *shrinker,
struct list_lru *lru, const char *name)
{
int ret = 0;
ret = register_shrinker(shrinker, name);
if (ret)
return ret;
ret = list_lru_init_memcg(lru, shrinker);
if (ret)
unregister_shrinker(shrinker);
return ret;
}
static void nfs4_xattr_shrinker_destroy(struct shrinker *shrinker,
struct list_lru *lru)
{
unregister_shrinker(shrinker);
list_lru_destroy(lru);
}
int __init nfs4_xattr_cache_init(void) int __init nfs4_xattr_cache_init(void)
{ {
int ret = 0; int ret = 0;
...@@ -1002,44 +1025,30 @@ int __init nfs4_xattr_cache_init(void) ...@@ -1002,44 +1025,30 @@ int __init nfs4_xattr_cache_init(void)
if (nfs4_xattr_cache_cachep == NULL) if (nfs4_xattr_cache_cachep == NULL)
return -ENOMEM; return -ENOMEM;
ret = list_lru_init_memcg(&nfs4_xattr_large_entry_lru, ret = nfs4_xattr_shrinker_init(&nfs4_xattr_cache_shrinker,
&nfs4_xattr_large_entry_shrinker); &nfs4_xattr_cache_lru,
if (ret) "nfs-xattr_cache");
goto out4;
ret = list_lru_init_memcg(&nfs4_xattr_entry_lru,
&nfs4_xattr_entry_shrinker);
if (ret)
goto out3;
ret = list_lru_init_memcg(&nfs4_xattr_cache_lru,
&nfs4_xattr_cache_shrinker);
if (ret)
goto out2;
ret = register_shrinker(&nfs4_xattr_cache_shrinker, "nfs-xattr_cache");
if (ret) if (ret)
goto out1; goto out1;
ret = register_shrinker(&nfs4_xattr_entry_shrinker, "nfs-xattr_entry"); ret = nfs4_xattr_shrinker_init(&nfs4_xattr_entry_shrinker,
&nfs4_xattr_entry_lru,
"nfs-xattr_entry");
if (ret) if (ret)
goto out; goto out2;
ret = register_shrinker(&nfs4_xattr_large_entry_shrinker, ret = nfs4_xattr_shrinker_init(&nfs4_xattr_large_entry_shrinker,
"nfs-xattr_large_entry"); &nfs4_xattr_large_entry_lru,
"nfs-xattr_large_entry");
if (!ret) if (!ret)
return 0; return 0;
unregister_shrinker(&nfs4_xattr_entry_shrinker); nfs4_xattr_shrinker_destroy(&nfs4_xattr_entry_shrinker,
out: &nfs4_xattr_entry_lru);
unregister_shrinker(&nfs4_xattr_cache_shrinker);
out1:
list_lru_destroy(&nfs4_xattr_cache_lru);
out2: out2:
list_lru_destroy(&nfs4_xattr_entry_lru); nfs4_xattr_shrinker_destroy(&nfs4_xattr_cache_shrinker,
out3: &nfs4_xattr_cache_lru);
list_lru_destroy(&nfs4_xattr_large_entry_lru); out1:
out4:
kmem_cache_destroy(nfs4_xattr_cache_cachep); kmem_cache_destroy(nfs4_xattr_cache_cachep);
return ret; return ret;
...@@ -1047,11 +1056,11 @@ int __init nfs4_xattr_cache_init(void) ...@@ -1047,11 +1056,11 @@ int __init nfs4_xattr_cache_init(void)
void nfs4_xattr_cache_exit(void) void nfs4_xattr_cache_exit(void)
{ {
unregister_shrinker(&nfs4_xattr_large_entry_shrinker); nfs4_xattr_shrinker_destroy(&nfs4_xattr_large_entry_shrinker,
unregister_shrinker(&nfs4_xattr_entry_shrinker); &nfs4_xattr_large_entry_lru);
unregister_shrinker(&nfs4_xattr_cache_shrinker); nfs4_xattr_shrinker_destroy(&nfs4_xattr_entry_shrinker,
list_lru_destroy(&nfs4_xattr_large_entry_lru); &nfs4_xattr_entry_lru);
list_lru_destroy(&nfs4_xattr_entry_lru); nfs4_xattr_shrinker_destroy(&nfs4_xattr_cache_shrinker,
list_lru_destroy(&nfs4_xattr_cache_lru); &nfs4_xattr_cache_lru);
kmem_cache_destroy(nfs4_xattr_cache_cachep); kmem_cache_destroy(nfs4_xattr_cache_cachep);
} }
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