Re: [PATCH v2] fs: push nr_cached_objects memcg gating into individual filesystems

Baolin Wang <[email protected]>
Newsgroups org.kernel.vger.linux-btrfs,org.kernel.vger.cgroups,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kvack.linux-mm
Message-ID <[email protected]>

On 7/15/26 6:35 PM, Usama Arif wrote:
> Commit 0baad6f9b997 ("fs/super: skip non-memcg-aware nr_cached_objects
> in memcg slab shrink") added a check in fs/super.c that skipped every
> ->nr_cached_objects() hook whenever the shrinker was invoked for a
> non-root memcg, on the assumption that none of them honour sc->memcg.
> 
> That assumption is wrong for XFS, whose inode-reclaim hook is
> intentionally driven from per-memcg contexts to free memcg-charged
> slab. Encoding a blanket "never memcg-aware" policy in fs/super.c
> short-circuits that path.
> 
> Push the check down into the callbacks whose counters really are
> irrelevant to per-memcg reclaim - btrfs_nr_cached_objects() and
> shmem_unused_huge_count() - and drop the fs/super.c gate. Each
> filesystem can now lift the restriction independently if its counter
> later grows memcg awareness, without touching fs/super.c.
> 
> Introduce mem_cgroup_shrink_is_root() in <linux/memcontrol.h> so the
> callbacks don't open-code "sc->memcg is NULL or root".
> 
> Fixes: 0baad6f9b997 ("fs/super: skip non-memcg-aware nr_cached_objects in memcg slab shrink")
> Acked-by: Qi Zheng <[email protected]>
> Reviewed-by: Jan Kara <[email protected]>
> Reviewed-by: Shakeel Butt <[email protected]>
> Signed-off-by: Usama Arif <[email protected]>
> ---

[snip]

> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> index e1f46a0016fc..5407e4200460 100644
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -520,6 +520,22 @@ static inline bool mem_cgroup_is_root(struct mem_cgroup *memcg)
>   	return (memcg == root_mem_cgroup);
>   }
>   
> +/**
> + * mem_cgroup_shrink_is_root - is this a global or root-memcg shrink invocation?
> + * @sc: shrink_control describing the current shrinker call
> + *
> + * Returns true when @sc represents a global reclaim shrink (sc->memcg == NULL)
> + * or a root-memcg shrink, i.e. not a per-memcg iteration of
> + * shrink_slab_memcg(). Filesystems whose ->nr_cached_objects()/
> + * ->free_cached_objects() implementations operate on filesystem-global state
> + * and do not honour sc->memcg can use this to early-return 0 in per-memcg
> + * contexts.
> + */
> +static inline bool mem_cgroup_shrink_is_root(struct shrink_control *sc)
> +{
> +	return !sc->memcg || mem_cgroup_is_root(sc->memcg);
> +}
> +
>   static inline bool obj_cgroup_is_root(const struct obj_cgroup *objcg)
>   {
>   	return objcg->is_root;
> @@ -1071,6 +1087,11 @@ static inline bool mem_cgroup_is_root(struct mem_cgroup *memcg)
>   	return true;
>   }
>   
> +static inline bool mem_cgroup_shrink_is_root(struct shrink_control *sc)
> +{
> +	return true;
> +}
> +
>   static inline bool obj_cgroup_is_root(const struct obj_cgroup *objcg)
>   {
>   	return true;
> diff --git a/mm/shmem.c b/mm/shmem.c
> index 5789a0f5a346..dc8cd4f563f4 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -846,6 +846,16 @@ static long shmem_unused_huge_count(struct super_block *sb,
>   		struct shrink_control *sc)
>   {
>   	struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
> +
> +	/*
> +	 * The per-superblock shrinklist is filesystem-global and does not
> +	 * honour sc->memcg, so it is only meaningful on the global (kswapd or
> +	 * root direct reclaim) shrink path. Skip the per-memcg iterations of
> +	 * shrink_slab_memcg() to avoid queueing duplicate global work.
> +	 */
> +	if (!mem_cgroup_shrink_is_root(sc))
> +		return 0;
> +
>   	return READ_ONCE(sbinfo->shrinklist_len);
>   }
>   #else /* !CONFIG_TRANSPARENT_HUGEPAGE */

For shmem part, LGTM.
Reviewed-by: Baolin Wang <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.