From: Michal Hocko <mhocko@suse.com>
To: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Johannes Weiner <hannes@cmpxchg.org>,
Roman Gushchin <roman.gushchin@linux.dev>,
Muchun Song <muchun.song@linux.dev>,
David Hildenbrand <david@kernel.org>,
Lorenzo Stoakes <ljs@kernel.org>,
Kairui Song <kasong@tencent.com>, Qi Zheng <qi.zheng@linux.dev>,
Barry Song <baohua@kernel.org>,
Axel Rasmussen <axelrasmussen@google.com>,
Meta kernel team <kernel-team@meta.com>,
linux-mm@kvack.org, cgroups@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 9/9] memcg: simplify v1 event ratelimiting
Date: Thu, 13 Aug 2026 10:28:52 +0200 [thread overview]
Message-ID: <an2ARNynd2QQU6eJ@tiehlicka> (raw)
In-Reply-To: <20260811203203.3456029-10-shakeel.butt@linux.dev>
On Tue 11-08-26 13:32:03, Shakeel Butt wrote:
> Thresholds are the only periodic v1 event left, so the target enum, the
> per-cpu target array and the switch in memcg1_event_ratelimit() all
> collapse to a single counter.
>
> memcg1_check_events() no longer needs a node id either, which lets
> memcg1_uncharge_batch() drop its nid argument and struct
> uncharge_gather drop the field feeding it.
>
> Signed-off-by: Shakeel Butt <shakeel.butt@linux.dev>
Acked-by: Michal Hocko <mhocko@suse.com>
Thanks!
> ---
> mm/memcontrol-v1.c | 43 +++++++++++--------------------------------
> mm/memcontrol-v1.h | 4 ++--
> mm/memcontrol.c | 4 +---
> 3 files changed, 14 insertions(+), 37 deletions(-)
>
> diff --git a/mm/memcontrol-v1.c b/mm/memcontrol-v1.c
> index 475f998b7643..bf2c7d53b01b 100644
> --- a/mm/memcontrol-v1.c
> +++ b/mm/memcontrol-v1.c
> @@ -200,15 +200,9 @@ static void mem_cgroup_threshold(struct mem_cgroup *memcg)
> * to trigger some periodic events. This is straightforward and better
> * than using jiffies etc. to handle periodic memcg event.
> */
> -enum mem_cgroup_events_target {
> - MEM_CGROUP_TARGET_THRESH,
> - MEM_CGROUP_TARGET_SOFTLIMIT,
> - MEM_CGROUP_NTARGETS,
> -};
> -
> struct memcg1_events_percpu {
> unsigned long nr_page_events;
> - unsigned long targets[MEM_CGROUP_NTARGETS];
> + unsigned long threshold_target;
> };
>
> static void memcg1_charge_statistics(struct mem_cgroup *memcg, int nr_pages)
> @@ -225,43 +219,28 @@ static void memcg1_charge_statistics(struct mem_cgroup *memcg, int nr_pages)
> }
>
> #define THRESHOLDS_EVENTS_TARGET 128
> -#define SOFTLIMIT_EVENTS_TARGET 1024
>
> -static bool memcg1_event_ratelimit(struct mem_cgroup *memcg,
> - enum mem_cgroup_events_target target)
> +static bool memcg1_event_ratelimit(struct mem_cgroup *memcg)
> {
> unsigned long val, next;
>
> val = __this_cpu_read(memcg->events_percpu->nr_page_events);
> - next = __this_cpu_read(memcg->events_percpu->targets[target]);
> + next = __this_cpu_read(memcg->events_percpu->threshold_target);
> /* from time_after() in jiffies.h */
> if ((long)(next - val) < 0) {
> - switch (target) {
> - case MEM_CGROUP_TARGET_THRESH:
> - next = val + THRESHOLDS_EVENTS_TARGET;
> - break;
> - case MEM_CGROUP_TARGET_SOFTLIMIT:
> - next = val + SOFTLIMIT_EVENTS_TARGET;
> - break;
> - default:
> - break;
> - }
> - __this_cpu_write(memcg->events_percpu->targets[target], next);
> + __this_cpu_write(memcg->events_percpu->threshold_target,
> + val + THRESHOLDS_EVENTS_TARGET);
> return true;
> }
> return false;
> }
>
> -/*
> - * Check events in order.
> - *
> - */
> -static void memcg1_check_events(struct mem_cgroup *memcg, int nid)
> +static void memcg1_check_events(struct mem_cgroup *memcg)
> {
> if (IS_ENABLED(CONFIG_PREEMPT_RT))
> return;
>
> - if (unlikely(memcg1_event_ratelimit(memcg, MEM_CGROUP_TARGET_THRESH)))
> + if (unlikely(memcg1_event_ratelimit(memcg)))
> mem_cgroup_threshold(memcg);
> }
>
> @@ -271,7 +250,7 @@ void memcg1_commit_charge(struct folio *folio, struct mem_cgroup *memcg)
>
> local_irq_save(flags);
> memcg1_charge_statistics(memcg, folio_nr_pages(folio));
> - memcg1_check_events(memcg, folio_nid(folio));
> + memcg1_check_events(memcg);
> local_irq_restore(flags);
> }
>
> @@ -344,7 +323,7 @@ void __memcg1_swapout(struct folio *folio, struct swap_cluster_info *ci)
> VM_WARN_ON_IRQS_ENABLED();
> memcg1_charge_statistics(memcg, -folio_nr_pages(folio));
> preempt_enable_nested();
> - memcg1_check_events(memcg, folio_nid(folio));
> + memcg1_check_events(memcg);
>
> rcu_read_unlock();
> obj_cgroup_put(objcg);
> @@ -398,14 +377,14 @@ void memcg1_swapin(struct folio *folio)
> #endif
>
> void memcg1_uncharge_batch(struct mem_cgroup *memcg, unsigned long pgpgout,
> - unsigned long nr_memory, int nid)
> + unsigned long nr_memory)
> {
> unsigned long flags;
>
> local_irq_save(flags);
> count_memcg_events(memcg, PGPGOUT, pgpgout);
> __this_cpu_add(memcg->events_percpu->nr_page_events, nr_memory);
> - memcg1_check_events(memcg, nid);
> + memcg1_check_events(memcg);
> local_irq_restore(flags);
> }
>
> diff --git a/mm/memcontrol-v1.h b/mm/memcontrol-v1.h
> index f48d0e22e615..b9a21f0fd2c3 100644
> --- a/mm/memcontrol-v1.h
> +++ b/mm/memcontrol-v1.h
> @@ -59,7 +59,7 @@ void memcg1_oom_recover(struct mem_cgroup *memcg);
>
> void memcg1_commit_charge(struct folio *folio, struct mem_cgroup *memcg);
> void memcg1_uncharge_batch(struct mem_cgroup *memcg, unsigned long pgpgout,
> - unsigned long nr_memory, int nid);
> + unsigned long nr_memory);
>
> void memcg1_stat_format(struct mem_cgroup *memcg, struct seq_buf *s);
> void reparent_memcg1_state_local(struct mem_cgroup *memcg, struct mem_cgroup *parent);
> @@ -107,7 +107,7 @@ static inline void memcg1_commit_charge(struct folio *folio,
>
> static inline void memcg1_uncharge_batch(struct mem_cgroup *memcg,
> unsigned long pgpgout,
> - unsigned long nr_memory, int nid) {}
> + unsigned long nr_memory) {}
>
> static inline void memcg1_stat_format(struct mem_cgroup *memcg, struct seq_buf *s) {}
>
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index ba3ef821553d..44ef376d657b 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -5293,7 +5293,6 @@ struct uncharge_gather {
> unsigned long nr_memory;
> unsigned long pgpgout;
> unsigned long nr_kmem;
> - int nid;
> };
>
> static inline void uncharge_gather_clear(struct uncharge_gather *ug)
> @@ -5316,7 +5315,7 @@ static void uncharge_batch(const struct uncharge_gather *ug)
> memcg1_oom_recover(memcg);
> }
>
> - memcg1_uncharge_batch(memcg, ug->pgpgout, ug->nr_memory, ug->nid);
> + memcg1_uncharge_batch(memcg, ug->pgpgout, ug->nr_memory);
> rcu_read_unlock();
>
> /* drop reference from uncharge_folio */
> @@ -5345,7 +5344,6 @@ static void uncharge_folio(struct folio *folio, struct uncharge_gather *ug)
> uncharge_gather_clear(ug);
> }
> ug->objcg = objcg;
> - ug->nid = folio_nid(folio);
>
> /* pairs with obj_cgroup_put in uncharge_batch */
> obj_cgroup_get(objcg);
> --
> 2.53.0-Meta
--
Michal Hocko
SUSE Labs
next prev parent reply other threads:[~2026-08-13 8:28 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-11 20:31 [PATCH for-7.4 0/9] memcg: remove the v1 soft limit Shakeel Butt
2026-08-11 20:31 ` [PATCH 1/9] memcg: make the v1 soft limit knob inert Shakeel Butt
2026-08-12 22:50 ` Andrew Morton
2026-08-12 23:40 ` Shakeel Butt
2026-08-13 8:22 ` Michal Hocko
2026-08-11 20:31 ` [PATCH 2/9] memcg: remove v1 soft limit reclaim Shakeel Butt
2026-08-13 8:24 ` Michal Hocko
2026-08-11 20:31 ` [PATCH 3/9] memcg: remove mem_cgroup_shrink_node() Shakeel Butt
2026-08-13 8:24 ` Michal Hocko
2026-08-11 20:31 ` [PATCH 4/9] memcg: remove the soft limit reclaim tracepoints Shakeel Butt
2026-08-13 8:25 ` Michal Hocko
2026-08-11 20:31 ` [PATCH 5/9] memcg: remove the soft limit rbtree Shakeel Butt
2026-08-13 8:25 ` Michal Hocko
2026-08-11 20:32 ` [PATCH 6/9] memcg: remove lru_gen_soft_reclaim() Shakeel Butt
2026-08-13 8:26 ` Michal Hocko
2026-08-11 20:32 ` [PATCH 7/9] memcg: remove the per-node soft limit tree fields Shakeel Butt
2026-08-13 8:27 ` Michal Hocko
2026-08-11 20:32 ` [PATCH 8/9] memcg: remove mem_cgroup->soft_limit Shakeel Butt
2026-08-13 8:27 ` Michal Hocko
2026-08-11 20:32 ` [PATCH 9/9] memcg: simplify v1 event ratelimiting Shakeel Butt
2026-08-13 8:28 ` Michal Hocko [this message]
2026-08-13 9:27 ` [PATCH for-7.4 0/9] memcg: remove the v1 soft limit Lorenzo Stoakes (ARM)
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=an2ARNynd2QQU6eJ@tiehlicka \
--to=mhocko@suse.com \
--cc=akpm@linux-foundation.org \
--cc=axelrasmussen@google.com \
--cc=baohua@kernel.org \
--cc=cgroups@vger.kernel.org \
--cc=david@kernel.org \
--cc=hannes@cmpxchg.org \
--cc=kasong@tencent.com \
--cc=kernel-team@meta.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=muchun.song@linux.dev \
--cc=qi.zheng@linux.dev \
--cc=roman.gushchin@linux.dev \
--cc=shakeel.butt@linux.dev \
/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.