Re: [PATCH] memcg: flush nr_charged_bytes when the obj stock trylock fails
From: Muchun Song
Date: Wed Nov 11 2026 - 21:31:08 EST
> On Nov 12, 2026, at 09:32, Shakeel Butt <shakeel.butt@xxxxxxxxx> wrote:
>
> When interrupt code, such as an RCU callback in softirq, runs on top of
> a task that holds the obj stock lock, its trylock fails and the bytes go
> to objcg->nr_charged_bytes. Nothing empties that counter while every CPU
> using the objcg keeps it in its stock, so it can grow without limit.
>
> Users see memory.current and the "kernel" field of memory.stat keep
> growing while the cgroup's real usage does not. With memory.high or
> memory.max set, the cgroup is reclaimed, throttled or even OOM-killed
> for memory it does not use. The counter is 32-bit, so after 4 GiB it
> wraps, and those 4 GiB stay charged to the cgroup and its ancestors
> until reboot, even after the cgroup is removed.
>
> Fix it by uncharging the whole pages in nr_charged_bytes whenever the
> trylock fails.
>
> Fixes: 200577f69f29 ("memcg: objcg stock trylock without irq disabling")
> Reported-by: Chris Mason <mason@xxxxxxxxxx>
> Signed-off-by: Shakeel Butt <shakeel.butt@xxxxxxxxx>
> Cc: stable@xxxxxxxxxxxxxxx
Acked-by: Muchun Song (ByteDance) <muchun.song@xxxxxxxxx>
Thanks.