* Re: question on memcg_stats_[un]lock in memcg code
2025-03-14 1:11 question on memcg_stats_[un]lock in memcg code Shakeel Butt
@ 2025-03-14 1:46 ` Shakeel Butt
2025-03-14 10:12 ` Sebastian Andrzej Siewior
0 siblings, 1 reply; 3+ messages in thread
From: Shakeel Butt @ 2025-03-14 1:46 UTC (permalink / raw)
To: Sebastian Andrzej Siewior; +Cc: linux-mm
On Thu, Mar 13, 2025 at 06:11:30PM -0700, Shakeel Butt wrote:
> Hi Sebastian,
>
> The commit be3e67b54b43 ("mm/memcg: protect per-CPU counter by disabling
> preemption on PREEMPT_RT where needed.") added memcg_stats_lock() and
> other variants in memcontrol.c. There usage were added in
> __mod_memcg_lruvec_state, __count_memcg_events and mem_cgroup_swapout. I
> am wondering why __mod_memcg_state was excluded?
>
Basically I wanted to know if the reason was that there were no direct
caller for __mod_memcg_state and something like the following patch is
fine with new direct caller:
From 6506b9463e2a96d1e9681dcaf6dece75e7050513 Mon Sep 17 00:00:00 2001
From: Shakeel Butt <shakeel.butt@linux.dev>
Date: Thu, 13 Mar 2025 18:27:41 -0700
Subject: [PATCH] memcg: use __mod_memcg_state in drain_obj_stock
For non-PREEMPT_RT kernels, drain_obj_stock() is always called with irq
disabled, so we can use __mod_memcg_state() instead of
mod_memcg_state(). For PREEMPT_RT, we need to add memcg_stats_[un]lock
in __mod_memcg_state().
Signed-off-by: Shakeel Butt <shakeel.butt@linux.dev>
---
mm/memcontrol.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 4de6acb9b8ec..8ddb9c94db7d 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -700,10 +700,12 @@ void __mod_memcg_state(struct mem_cgroup *memcg, enum memcg_stat_item idx,
if (WARN_ONCE(BAD_STAT_IDX(i), "%s: missing stat item %d\n", __func__, idx))
return;
+ memcg_stats_lock();
__this_cpu_add(memcg->vmstats_percpu->state[i], val);
val = memcg_state_val_in_pages(idx, val);
memcg_rstat_updated(memcg, val);
trace_mod_memcg_state(memcg, idx, val);
+ memcg_stats_unlock();
}
/* idx can be of type enum memcg_stat_item or node_stat_item. */
@@ -2791,7 +2793,7 @@ static struct obj_cgroup *drain_obj_stock(struct memcg_stock_pcp *stock)
memcg = get_mem_cgroup_from_objcg(old);
- mod_memcg_state(memcg, MEMCG_KMEM, -nr_pages);
+ __mod_memcg_state(memcg, MEMCG_KMEM, -nr_pages);
memcg1_account_kmem(memcg, -nr_pages);
__refill_stock(memcg, nr_pages);
--
2.47.1
^ permalink raw reply [flat|nested] 3+ messages in thread