Skip to content

Commit 15ca4fa

Browse files
shakeelbakpm00
authored andcommitted
memcg: nmi-safe slab stats updates
The objcg based kmem [un]charging can be called in nmi context and it may need to update NR_SLAB_[UN]RECLAIMABLE_B stats. So, let's correctly handle the updates of these stats in the nmi context. Link: https://lkml.kernel.org/r/20250519063142.111219-5-shakeel.butt@linux.dev Signed-off-by: Shakeel Butt <shakeel.butt@linux.dev> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Michal Hocko <mhocko@kernel.org> Cc: Muchun Song <muchun.song@linux.dev> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Roman Gushchin <roman.gushchin@linux.dev> Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Cc: Tejun Heo <tj@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 9d3edf9 commit 15ca4fa

1 file changed

Lines changed: 33 additions & 3 deletions

File tree

mm/memcontrol.c

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2515,17 +2515,47 @@ static void commit_charge(struct folio *folio, struct mem_cgroup *memcg)
25152515
folio->memcg_data = (unsigned long)memcg;
25162516
}
25172517

2518+
#ifdef CONFIG_MEMCG_NMI_SAFETY_REQUIRES_ATOMIC
2519+
static inline void account_slab_nmi_safe(struct mem_cgroup *memcg,
2520+
struct pglist_data *pgdat,
2521+
enum node_stat_item idx, int nr)
2522+
{
2523+
struct lruvec *lruvec;
2524+
2525+
if (likely(!in_nmi())) {
2526+
lruvec = mem_cgroup_lruvec(memcg, pgdat);
2527+
mod_memcg_lruvec_state(lruvec, idx, nr);
2528+
} else {
2529+
struct mem_cgroup_per_node *pn = memcg->nodeinfo[pgdat->node_id];
2530+
2531+
/* TODO: add to cgroup update tree once it is nmi-safe. */
2532+
if (idx == NR_SLAB_RECLAIMABLE_B)
2533+
atomic_add(nr, &pn->slab_reclaimable);
2534+
else
2535+
atomic_add(nr, &pn->slab_unreclaimable);
2536+
}
2537+
}
2538+
#else
2539+
static inline void account_slab_nmi_safe(struct mem_cgroup *memcg,
2540+
struct pglist_data *pgdat,
2541+
enum node_stat_item idx, int nr)
2542+
{
2543+
struct lruvec *lruvec;
2544+
2545+
lruvec = mem_cgroup_lruvec(memcg, pgdat);
2546+
mod_memcg_lruvec_state(lruvec, idx, nr);
2547+
}
2548+
#endif
2549+
25182550
static inline void mod_objcg_mlstate(struct obj_cgroup *objcg,
25192551
struct pglist_data *pgdat,
25202552
enum node_stat_item idx, int nr)
25212553
{
25222554
struct mem_cgroup *memcg;
2523-
struct lruvec *lruvec;
25242555

25252556
rcu_read_lock();
25262557
memcg = obj_cgroup_memcg(objcg);
2527-
lruvec = mem_cgroup_lruvec(memcg, pgdat);
2528-
mod_memcg_lruvec_state(lruvec, idx, nr);
2558+
account_slab_nmi_safe(memcg, pgdat, idx, nr);
25292559
rcu_read_unlock();
25302560
}
25312561

0 commit comments

Comments
 (0)