Commit e16f17a9 authored by Alexandre Ghiti's avatar Alexandre Ghiti Committed by Andrew Morton
Browse files

mm: memcontrol: propagate NMI slab stats to memcg vmstats

flush_nmi_stats() drains per-node NMI slab atomics into the per-node
lruvec_stats, but does not propagate them to the memcg-level vmstats.

For non NMI case, account_slab_nmi_safe() calls mod_memcg_lruvec_state()
which updates both per-node lruvec_stats and memcg-level vmstats, so
flush_nmi_stats() needs to flush to per-node lruvec_stats as well as
memcg-level vmstats.

So fix this by flushing to the memcg-level vmstats for NMI too.

Link: https://lore.kernel.org/20260518082830.599102-1-alex@ghiti.fr


Fixes: 940b01fc ("memcg: nmi safe memcg stats for specific archs")
Signed-off-by: default avatarAlexandre Ghiti <alex@ghiti.fr>
Acked-by: default avatarShakeel Butt <shakeel.butt@linux.dev>
Acked-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
Reviewed-by: default avatarHarry Yoo (Oracle) <harry@kernel.org>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 441f92f7
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -4352,6 +4352,9 @@ static void flush_nmi_stats(struct mem_cgroup *memcg, struct mem_cgroup *parent,
			lstats->state[index] += slab;
			if (plstats)
				plstats->state_pending[index] += slab;
			memcg->vmstats->state[index] += slab;
			if (parent)
				parent->vmstats->state_pending[index] += slab;
		}
		if (atomic_read(&pn->slab_unreclaimable)) {
			int slab = atomic_xchg(&pn->slab_unreclaimable, 0);
@@ -4360,6 +4363,9 @@ static void flush_nmi_stats(struct mem_cgroup *memcg, struct mem_cgroup *parent,
			lstats->state[index] += slab;
			if (plstats)
				plstats->state_pending[index] += slab;
			memcg->vmstats->state[index] += slab;
			if (parent)
				parent->vmstats->state_pending[index] += slab;
		}
	}
}