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

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
Loading
Loading
Loading
Loading
+44 −35
Original line number Diff line number Diff line
@@ -991,6 +991,29 @@ static void nfs4_xattr_cache_init_once(void *p)
	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 ret = 0;
@@ -1002,44 +1025,30 @@ int __init nfs4_xattr_cache_init(void)
	if (nfs4_xattr_cache_cachep == NULL)
		return -ENOMEM;

	ret = list_lru_init_memcg(&nfs4_xattr_large_entry_lru,
	    &nfs4_xattr_large_entry_shrinker);
	if (ret)
		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");
	ret = nfs4_xattr_shrinker_init(&nfs4_xattr_cache_shrinker,
				       &nfs4_xattr_cache_lru,
				       "nfs-xattr_cache");
	if (ret)
		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)
		goto out;
		goto out2;

	ret = register_shrinker(&nfs4_xattr_large_entry_shrinker,
	ret = nfs4_xattr_shrinker_init(&nfs4_xattr_large_entry_shrinker,
				       &nfs4_xattr_large_entry_lru,
				       "nfs-xattr_large_entry");
	if (!ret)
		return 0;

	unregister_shrinker(&nfs4_xattr_entry_shrinker);
out:
	unregister_shrinker(&nfs4_xattr_cache_shrinker);
out1:
	list_lru_destroy(&nfs4_xattr_cache_lru);
	nfs4_xattr_shrinker_destroy(&nfs4_xattr_entry_shrinker,
				    &nfs4_xattr_entry_lru);
out2:
	list_lru_destroy(&nfs4_xattr_entry_lru);
out3:
	list_lru_destroy(&nfs4_xattr_large_entry_lru);
out4:
	nfs4_xattr_shrinker_destroy(&nfs4_xattr_cache_shrinker,
				    &nfs4_xattr_cache_lru);
out1:
	kmem_cache_destroy(nfs4_xattr_cache_cachep);

	return ret;
@@ -1047,11 +1056,11 @@ int __init nfs4_xattr_cache_init(void)

void nfs4_xattr_cache_exit(void)
{
	unregister_shrinker(&nfs4_xattr_large_entry_shrinker);
	unregister_shrinker(&nfs4_xattr_entry_shrinker);
	unregister_shrinker(&nfs4_xattr_cache_shrinker);
	list_lru_destroy(&nfs4_xattr_large_entry_lru);
	list_lru_destroy(&nfs4_xattr_entry_lru);
	list_lru_destroy(&nfs4_xattr_cache_lru);
	nfs4_xattr_shrinker_destroy(&nfs4_xattr_large_entry_shrinker,
				    &nfs4_xattr_large_entry_lru);
	nfs4_xattr_shrinker_destroy(&nfs4_xattr_entry_shrinker,
				    &nfs4_xattr_entry_lru);
	nfs4_xattr_shrinker_destroy(&nfs4_xattr_cache_shrinker,
				    &nfs4_xattr_cache_lru);
	kmem_cache_destroy(nfs4_xattr_cache_cachep);
}