From: Shakeel Butt <shakeel.butt@linux.dev>
To: Runli <mingyu.he@shopee.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>,
Michal Hocko <mhocko@kernel.org>,
Roman Gushchin <roman.gushchin@linux.dev>,
linux-mm@kvack.org, Muchun Song <muchun.song@linux.dev>,
Andrew Morton <akpm@linux-foundation.org>,
Yosry Ahmed <yosry@kernel.org>,
cgroups@vger.kernel.org, linux-kernel@vger.kernel.org,
littleswimmingwhale@gmail.com
Subject: Re: [PATCH v2] mm/bpf: Always flush memcg stats when explicitly requested
Date: Wed, 11 Nov 2026 08:05:08 -0800 [thread overview]
Message-ID: <avSR4bHP2HX5-OQo@linux.dev> (raw)
In-Reply-To: <20261111071434.34547-1-mingyu.he@shopee.com>
On Wed, Nov 11, 2026 at 03:14:34PM +0800, Runli wrote:
> memcg_rstat_updated() stops walking the ancestors when a memcg exceeds
> the flush threshold. A concurrent flush can leave an ancestor below the
> threshold, so the early exit prevents it from receiving further updates.
>
> Consider root and leaf on a 4-CPU system, with a threshold of 256.
> CPU 0 is flushing another CPU's stats after CPU 1's stats have already
> been flushed. The counts below are shared stats_updates counters:
>
> CPU 0 (root flush) CPU 1 (leaf updates)
> ------------------ --------------------
> clear leaf->stats_updates
> add 64 to leaf and root
> clear root->stats_updates
> finish flush
> leaf = 64, root = 0
> 4 more batches of 64:
> leaf = 320, root = 256
> next update:
> leaf > threshold
> break; root is not updated
>
> Root remains at the threshold, which is insufficient to trigger a flush,
> while further leaf updates keep taking the early exit. The periodic
> forced flush restores progress, but until then the root's aggregated
> statistics can fall far behind. For example, page cache grows at rate of
> 1 GiB/s, a two-second wait can leave the reported usage about 2 GiB below
> the actual usage.
>
> Make bpf_mem_cgroup_flush_stats() bypass the update threshold so BPF
> callers can explicitly flush stale statistics without waiting for the
> periodic flush.
>
> Suggested-by: Shakeel Butt <shakeel.butt@linux.dev>
> Link: https://lore.kernel.org/all/avKy9oMwDRjKjfzm@linux.dev/
> Signed-off-by: Runli <mingyu.he@shopee.com>
> ---
> Changes since v1:
> - Make the BPF kfunc flush unconditionally, as suggested by Shakeel.
> - Leave memcg_rstat_updated() unchanged.
>
> v1: https://lore.kernel.org/all/20260911032905.63683-1-mingyu.he@shopee.com/
>
> mm/bpf_memcontrol.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/mm/bpf_memcontrol.c b/mm/bpf_memcontrol.c
> index d8f579c28560..f8552651b6d6 100644
> --- a/mm/bpf_memcontrol.c
> +++ b/mm/bpf_memcontrol.c
> @@ -7,6 +7,7 @@
>
> #include <linux/memcontrol.h>
> #include <linux/bpf.h>
> +#include <linux/cgroup.h>
>
> #include "internal.h"
>
> @@ -154,11 +155,12 @@ __bpf_kfunc unsigned long bpf_mem_cgroup_page_state(struct mem_cgroup *memcg, in
> * bpf_mem_cgroup_flush_stats - Flush memory cgroup's statistics
> * @memcg: memory cgroup
> *
> - * Propagate memory cgroup's statistics up the cgroup tree.
> + * Flush the memory cgroup subtree and propagate its statistics up the cgroup
> + * tree, regardless of the number of pending updates.
> */
> __bpf_kfunc void bpf_mem_cgroup_flush_stats(struct mem_cgroup *memcg)
> {
> - mem_cgroup_flush_stats(memcg);
> + css_rstat_flush(&memcg->css);
Please expose mem_cgroup_flush_stats_force(memcg) which call
__mem_cgroup_flush_stats(memcg, true) or something like that. We have some
bookkeeping in __mem_cgroup_flush_stats() which we should not skip.
> }
>
> /**
> --
> 2.39.2 (Apple Git-143)
>
next prev parent reply other threads:[~2026-11-11 16:05 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-11 7:14 [PATCH v2] mm/bpf: Always flush memcg stats when explicitly requested Runli
2026-11-11 16:05 ` Shakeel Butt [this message]
2026-11-12 7:17 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=avSR4bHP2HX5-OQo@linux.dev \
--to=shakeel.butt@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=cgroups@vger.kernel.org \
--cc=hannes@cmpxchg.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=littleswimmingwhale@gmail.com \
--cc=mhocko@kernel.org \
--cc=mingyu.he@shopee.com \
--cc=muchun.song@linux.dev \
--cc=roman.gushchin@linux.dev \
--cc=yosry@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.