FAILED: patch "[PATCH] fs: push nr_cached_objects memcg gating into individual" failed to apply to 7.2-stable tree
Subsystems (5)
[email protected]
maintainerThe patch below does not apply to the 7.2-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-7.2.y
git checkout FETCH_HEAD
git cherry-pick -x 0ef8faff490be6aa1a1e5dfcb0c8492689e91c0f
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026092315-overtone-rename-4864@gregkh' --subject-prefix 'PATCH 7.2.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 0ef8faff490be6aa1a1e5dfcb0c8492689e91c0f Mon Sep 17 00:00:00 2001
From: Usama Arif <[email protected]>
Date: Wed, 15 Jul 2026 03:35:16 -0700
Subject: [PATCH] fs: push nr_cached_objects memcg gating into individual
filesystems
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".
fs/btrfs/super.c +10 -0
@@ -22,6 +22,7 @@#include <linux/namei.h> #include <linux/miscdevice.h> #include <linux/magic.h> +#include <linux/memcontrol.h> #include <linux/slab.h> #include <linux/ratelimit.h> #include <linux/crc32c.h>
@@ -2434,6 +2435,15 @@ static long btrfs_nr_cached_objects(struct super_block *sb, struct shrink_controstruct btrfs_fs_info *fs_info =btrfs_sb (sb);const s64 nr =percpu_counter_read_positive (&fs_info->evictable_extent_maps); +/* +* The evictable extent map counter 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 ; +trace_btrfs_extent_map_shrinker_count (fs_info, nr);return nr;
include/linux/memcontrol.h +21 -0
@@ -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;
mm/shmem.c +10 -0
@@ -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 */