[Devel] [PATCH VZ10] mm: fix negative dentry accounting by protecting memcg with rcu_read_lock

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Mon Aug 4 07:39:18 MSK 2025


This fixes the warning:

WARNING: CPU: 0 PID: 1 at include/linux/memcontrol.h:404 mem_cgroup_from_slab_obj+0x426/0x580

In this stack:

  +-> dput
    +-> __dentry_kill
      +-> d_lru_del
        +-> memcg_neg_dentry_dec
          +-> mem_cgroup_from_slab_obj
            +-> mem_cgroup_from_obj_folio
              +-> obj_cgroup_memcg

Detected when running xfstests-generic/321.

https://virtuozzo.atlassian.net/browse/VSTOR-112802
Fixes: 2b4edb1f998a ("mm: per-memcg negative dentries accounting")
Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>

Feature: mm: statistic enhancements
---
 mm/memcontrol.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 59eb819c91052..4512a16d9ede3 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3221,18 +3221,24 @@ unsigned long mem_cgroup_read_nd(struct mem_cgroup *memcg)
 
 void memcg_neg_dentry_inc(struct dentry *dentry)
 {
-	struct mem_cgroup *memcg = mem_cgroup_from_slab_obj(dentry);
+	struct mem_cgroup *memcg;
 
+	rcu_read_lock();
+	memcg = mem_cgroup_from_slab_obj(dentry);
 	if (memcg)
 		__this_cpu_inc(memcg->vmstats_percpu->nr_dentry_neg);
+	rcu_read_unlock();
 }
 
 void memcg_neg_dentry_dec(struct dentry *dentry)
 {
-	struct mem_cgroup *memcg = mem_cgroup_from_slab_obj(dentry);
+	struct mem_cgroup *memcg;
 
+	rcu_read_lock();
+	memcg = mem_cgroup_from_slab_obj(dentry);
 	if (memcg)
 		__this_cpu_dec(memcg->vmstats_percpu->nr_dentry_neg);
+	rcu_read_unlock();
 }
 
 /*
-- 
2.50.1



More information about the Devel mailing list