* [PATCH 0/3] correct the parameter type of some mm functions
@ 2026-03-24 11:31 Qi Zheng
2026-03-24 11:31 ` [PATCH] fix: mm: memcontrol: convert objcg to be per-memcg per-node type Qi Zheng
` (4 more replies)
0 siblings, 5 replies; 23+ messages in thread
From: Qi Zheng @ 2026-03-24 11:31 UTC (permalink / raw)
To: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, harry.yoo, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642
Cc: linux-mm, linux-kernel, Qi Zheng
From: Qi Zheng <zhengqi.arch@bytedance.com>
Hi all,
As Harry Yoo pointed out [1], in the case of reparenting LRU folios, the value
passed to functions such as __mod_memcg{_lruvec}_state() may exceed the upper
limit of int, so this series aims to correct the parameter type of these
functions.
This series is based on the next-20260323.
Comments and suggestions are welcome!
Thanks,
Qi
[1]. https://lore.kernel.org/all/acDxaEgnqPI-Z4be@hyeyoo/
Qi Zheng (3):
mm: memcontrol: correct the type of stats_updates to unsigned long
mm: memcontrol: correct the parameter type of
__mod_memcg{_lruvec}_state()
mm: memcontrol: correct the nr_pages parameter type of
mem_cgroup_update_lru_size()
include/linux/memcontrol.h | 2 +-
include/trace/events/memcg.h | 10 +++++-----
mm/memcontrol.c | 28 ++++++++++++++--------------
3 files changed, 20 insertions(+), 20 deletions(-)
--
2.20.1
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH] fix: mm: memcontrol: convert objcg to be per-memcg per-node type
2026-03-24 11:31 [PATCH 0/3] correct the parameter type of some mm functions Qi Zheng
@ 2026-03-24 11:31 ` Qi Zheng
2026-03-24 11:34 ` Qi Zheng
2026-03-24 11:31 ` [PATCH 1/3] mm: memcontrol: correct the type of stats_updates to unsigned long Qi Zheng
` (3 subsequent siblings)
4 siblings, 1 reply; 23+ messages in thread
From: Qi Zheng @ 2026-03-24 11:31 UTC (permalink / raw)
To: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, harry.yoo, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642
Cc: linux-mm, linux-kernel, Qi Zheng, Usama Arif
From: Qi Zheng <zhengqi.arch@bytedance.com>
Reset pn->orig_objcg to NULL to prevent obj_cgroup_put()
from being called agagin in __mem_cgroup_free().
Reported-by: Usama Arif <usama.arif@linux.dev>
Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
---
mm/memcontrol.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 992a3f5caa62b..ad32639ea5959 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -4140,8 +4140,14 @@ static int mem_cgroup_css_online(struct cgroup_subsys_state *css)
for_each_node(nid) {
struct mem_cgroup_per_node *pn = memcg->nodeinfo[nid];
- if (pn && pn->orig_objcg)
+ if (pn && pn->orig_objcg) {
obj_cgroup_put(pn->orig_objcg);
+ /*
+ * Reset pn->orig_objcg to NULL to prevent obj_cgroup_put()
+ * from being called agagin in __mem_cgroup_free().
+ */
+ pn->orig_objcg = NULL;
+ }
}
free_shrinker_info(memcg);
offline_kmem:
--
2.20.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 1/3] mm: memcontrol: correct the type of stats_updates to unsigned long
2026-03-24 11:31 [PATCH 0/3] correct the parameter type of some mm functions Qi Zheng
2026-03-24 11:31 ` [PATCH] fix: mm: memcontrol: convert objcg to be per-memcg per-node type Qi Zheng
@ 2026-03-24 11:31 ` Qi Zheng
2026-03-24 12:20 ` Lorenzo Stoakes (Oracle)
2026-03-24 11:31 ` [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state() Qi Zheng
` (2 subsequent siblings)
4 siblings, 1 reply; 23+ messages in thread
From: Qi Zheng @ 2026-03-24 11:31 UTC (permalink / raw)
To: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, harry.yoo, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642
Cc: linux-mm, linux-kernel, Qi Zheng
From: Qi Zheng <zhengqi.arch@bytedance.com>
Now, the memcg_rstat_updated() is for vmstats_percpu->state and
lruvec_stats_percpu->state, which are both of type long, so let's change
the type of stats_updates to unsigned long as well.
Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
---
mm/memcontrol.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index a47fb68dd65f1..7fb9cbc10dfbb 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -608,7 +608,7 @@ static inline int memcg_events_index(enum vm_event_item idx)
struct memcg_vmstats_percpu {
/* Stats updates since the last flush */
- unsigned int stats_updates;
+ unsigned long stats_updates;
/* Cached pointers for fast iteration in memcg_rstat_updated() */
struct memcg_vmstats_percpu __percpu *parent_pcpu;
@@ -639,7 +639,7 @@ struct memcg_vmstats {
unsigned long events_pending[NR_MEMCG_EVENTS];
/* Stats updates since the last flush */
- atomic_t stats_updates;
+ atomic_long_t stats_updates;
};
/*
@@ -665,16 +665,16 @@ static u64 flush_last_time;
static bool memcg_vmstats_needs_flush(struct memcg_vmstats *vmstats)
{
- return atomic_read(&vmstats->stats_updates) >
+ return atomic_long_read(&vmstats->stats_updates) >
MEMCG_CHARGE_BATCH * num_online_cpus();
}
-static inline void memcg_rstat_updated(struct mem_cgroup *memcg, int val,
+static inline void memcg_rstat_updated(struct mem_cgroup *memcg, long val,
int cpu)
{
struct memcg_vmstats_percpu __percpu *statc_pcpu;
struct memcg_vmstats_percpu *statc;
- unsigned int stats_updates;
+ unsigned long stats_updates;
if (!val)
return;
@@ -697,7 +697,7 @@ static inline void memcg_rstat_updated(struct mem_cgroup *memcg, int val,
continue;
stats_updates = this_cpu_xchg(statc_pcpu->stats_updates, 0);
- atomic_add(stats_updates, &statc->vmstats->stats_updates);
+ atomic_long_add(stats_updates, &statc->vmstats->stats_updates);
}
}
@@ -705,7 +705,7 @@ static void __mem_cgroup_flush_stats(struct mem_cgroup *memcg, bool force)
{
bool needs_flush = memcg_vmstats_needs_flush(memcg->vmstats);
- trace_memcg_flush_stats(memcg, atomic_read(&memcg->vmstats->stats_updates),
+ trace_memcg_flush_stats(memcg, atomic_long_read(&memcg->vmstats->stats_updates),
force, needs_flush);
if (!force && !needs_flush)
@@ -4406,8 +4406,8 @@ static void mem_cgroup_css_rstat_flush(struct cgroup_subsys_state *css, int cpu)
}
WRITE_ONCE(statc->stats_updates, 0);
/* We are in a per-cpu loop here, only do the atomic write once */
- if (atomic_read(&memcg->vmstats->stats_updates))
- atomic_set(&memcg->vmstats->stats_updates, 0);
+ if (atomic_long_read(&memcg->vmstats->stats_updates))
+ atomic_long_set(&memcg->vmstats->stats_updates, 0);
}
static void mem_cgroup_fork(struct task_struct *task)
--
2.20.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state()
2026-03-24 11:31 [PATCH 0/3] correct the parameter type of some mm functions Qi Zheng
2026-03-24 11:31 ` [PATCH] fix: mm: memcontrol: convert objcg to be per-memcg per-node type Qi Zheng
2026-03-24 11:31 ` [PATCH 1/3] mm: memcontrol: correct the type of stats_updates to unsigned long Qi Zheng
@ 2026-03-24 11:31 ` Qi Zheng
2026-03-24 12:21 ` Lorenzo Stoakes (Oracle)
2026-03-25 1:43 ` Harry Yoo (Oracle)
2026-03-24 11:31 ` [PATCH 3/3] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size() Qi Zheng
2026-03-24 11:57 ` [PATCH 0/3] correct the parameter type of some mm functions Lorenzo Stoakes (Oracle)
4 siblings, 2 replies; 23+ messages in thread
From: Qi Zheng @ 2026-03-24 11:31 UTC (permalink / raw)
To: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, harry.yoo, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642
Cc: linux-mm, linux-kernel, Qi Zheng
From: Qi Zheng <zhengqi.arch@bytedance.com>
The __mod_memcg_state() and __mod_memcg_lruvec_state() were used to
reparent non-hierarchical stats, the values passed to them might exceed
the upper limit of the type int, so correct the val parameter type of them
to long.
Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
---
include/trace/events/memcg.h | 10 +++++-----
mm/memcontrol.c | 8 ++++----
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/include/trace/events/memcg.h b/include/trace/events/memcg.h
index dfe2f51019b4c..51b62c5931fc2 100644
--- a/include/trace/events/memcg.h
+++ b/include/trace/events/memcg.h
@@ -11,14 +11,14 @@
DECLARE_EVENT_CLASS(memcg_rstat_stats,
- TP_PROTO(struct mem_cgroup *memcg, int item, int val),
+ TP_PROTO(struct mem_cgroup *memcg, int item, long val),
TP_ARGS(memcg, item, val),
TP_STRUCT__entry(
__field(u64, id)
__field(int, item)
- __field(int, val)
+ __field(long, val)
),
TP_fast_assign(
@@ -27,20 +27,20 @@ DECLARE_EVENT_CLASS(memcg_rstat_stats,
__entry->val = val;
),
- TP_printk("memcg_id=%llu item=%d val=%d",
+ TP_printk("memcg_id=%llu item=%d val=%ld",
__entry->id, __entry->item, __entry->val)
);
DEFINE_EVENT(memcg_rstat_stats, mod_memcg_state,
- TP_PROTO(struct mem_cgroup *memcg, int item, int val),
+ TP_PROTO(struct mem_cgroup *memcg, int item, long val),
TP_ARGS(memcg, item, val)
);
DEFINE_EVENT(memcg_rstat_stats, mod_memcg_lruvec_state,
- TP_PROTO(struct mem_cgroup *memcg, int item, int val),
+ TP_PROTO(struct mem_cgroup *memcg, int item, long val),
TP_ARGS(memcg, item, val)
);
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 7fb9cbc10dfbb..4a78550f6174e 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -527,7 +527,7 @@ unsigned long lruvec_page_state_local(struct lruvec *lruvec,
#ifdef CONFIG_MEMCG_V1
static void __mod_memcg_lruvec_state(struct mem_cgroup_per_node *pn,
- enum node_stat_item idx, int val);
+ enum node_stat_item idx, long val);
void reparent_memcg_lruvec_state_local(struct mem_cgroup *memcg,
struct mem_cgroup *parent, int idx)
@@ -784,7 +784,7 @@ static int memcg_page_state_unit(int item);
* Normalize the value passed into memcg_rstat_updated() to be in pages. Round
* up non-zero sub-page updates to 1 page as zero page updates are ignored.
*/
-static int memcg_state_val_in_pages(int idx, int val)
+static long memcg_state_val_in_pages(int idx, long val)
{
int unit = memcg_page_state_unit(idx);
@@ -831,7 +831,7 @@ static inline void get_non_dying_memcg_end(void)
#endif
static void __mod_memcg_state(struct mem_cgroup *memcg,
- enum memcg_stat_item idx, int val)
+ enum memcg_stat_item idx, long val)
{
int i = memcg_stats_index(idx);
int cpu;
@@ -896,7 +896,7 @@ void reparent_memcg_state_local(struct mem_cgroup *memcg,
#endif
static void __mod_memcg_lruvec_state(struct mem_cgroup_per_node *pn,
- enum node_stat_item idx, int val)
+ enum node_stat_item idx, long val)
{
struct mem_cgroup *memcg = pn->memcg;
int i = memcg_stats_index(idx);
--
2.20.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 3/3] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size()
2026-03-24 11:31 [PATCH 0/3] correct the parameter type of some mm functions Qi Zheng
` (2 preceding siblings ...)
2026-03-24 11:31 ` [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state() Qi Zheng
@ 2026-03-24 11:31 ` Qi Zheng
2026-03-24 12:28 ` Lorenzo Stoakes (Oracle)
2026-03-26 2:35 ` kernel test robot
2026-03-24 11:57 ` [PATCH 0/3] correct the parameter type of some mm functions Lorenzo Stoakes (Oracle)
4 siblings, 2 replies; 23+ messages in thread
From: Qi Zheng @ 2026-03-24 11:31 UTC (permalink / raw)
To: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, harry.yoo, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642
Cc: linux-mm, linux-kernel, Qi Zheng
From: Qi Zheng <zhengqi.arch@bytedance.com>
The nr_pages parameter of mem_cgroup_update_lru_size() should clearly
be long instead of int, let's correct it.
Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
---
include/linux/memcontrol.h | 2 +-
mm/memcontrol.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index 0861589695298..dc3fa687759b4 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -878,7 +878,7 @@ static inline bool mem_cgroup_online(struct mem_cgroup *memcg)
}
void mem_cgroup_update_lru_size(struct lruvec *lruvec, enum lru_list lru,
- int zid, int nr_pages);
+ int zid, long nr_pages);
static inline
unsigned long mem_cgroup_get_zone_lru_size(struct lruvec *lruvec,
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 4a78550f6174e..6491ca74b3398 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1466,7 +1466,7 @@ struct lruvec *folio_lruvec_lock_irqsave(struct folio *folio,
* to or just after a page is removed from an lru list.
*/
void mem_cgroup_update_lru_size(struct lruvec *lruvec, enum lru_list lru,
- int zid, int nr_pages)
+ int zid, long nr_pages)
{
struct mem_cgroup_per_node *mz;
unsigned long *lru_size;
--
2.20.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH] fix: mm: memcontrol: convert objcg to be per-memcg per-node type
2026-03-24 11:31 ` [PATCH] fix: mm: memcontrol: convert objcg to be per-memcg per-node type Qi Zheng
@ 2026-03-24 11:34 ` Qi Zheng
0 siblings, 0 replies; 23+ messages in thread
From: Qi Zheng @ 2026-03-24 11:34 UTC (permalink / raw)
To: Qi Zheng, hannes, hughd, mhocko, roman.gushchin, shakeel.butt,
muchun.song, david, lorenzo.stoakes, ziy, harry.yoo, yosry.ahmed,
imran.f.khan, kamalesh.babulal, axelrasmussen, yuanchu, weixugc,
chenridong, mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe,
usamaarif642
Cc: linux-mm, linux-kernel, Usama Arif
Oops, Please ignore this patch.
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 0/3] correct the parameter type of some mm functions
2026-03-24 11:31 [PATCH 0/3] correct the parameter type of some mm functions Qi Zheng
` (3 preceding siblings ...)
2026-03-24 11:31 ` [PATCH 3/3] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size() Qi Zheng
@ 2026-03-24 11:57 ` Lorenzo Stoakes (Oracle)
4 siblings, 0 replies; 23+ messages in thread
From: Lorenzo Stoakes (Oracle) @ 2026-03-24 11:57 UTC (permalink / raw)
To: Qi Zheng
Cc: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, ziy, harry.yoo, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642,
linux-mm, linux-kernel, Qi Zheng
-cc old mail
(just a gentle nudge to send stuff to ljs@kernel.org instead thanks :)
On Tue, Mar 24, 2026 at 07:31:25PM +0800, Qi Zheng wrote:
> From: Qi Zheng <zhengqi.arch@bytedance.com>
>
> Hi all,
>
> As Harry Yoo pointed out [1], in the case of reparenting LRU folios, the value
> passed to functions such as __mod_memcg{_lruvec}_state() may exceed the upper
> limit of int, so this series aims to correct the parameter type of these
> functions.
>
> This series is based on the next-20260323.
>
> Comments and suggestions are welcome!
>
> Thanks,
> Qi
>
> [1]. https://lore.kernel.org/all/acDxaEgnqPI-Z4be@hyeyoo/
>
> Qi Zheng (3):
> mm: memcontrol: correct the type of stats_updates to unsigned long
> mm: memcontrol: correct the parameter type of
> __mod_memcg{_lruvec}_state()
> mm: memcontrol: correct the nr_pages parameter type of
> mem_cgroup_update_lru_size()
>
> include/linux/memcontrol.h | 2 +-
> include/trace/events/memcg.h | 10 +++++-----
> mm/memcontrol.c | 28 ++++++++++++++--------------
> 3 files changed, 20 insertions(+), 20 deletions(-)
>
> --
> 2.20.1
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/3] mm: memcontrol: correct the type of stats_updates to unsigned long
2026-03-24 11:31 ` [PATCH 1/3] mm: memcontrol: correct the type of stats_updates to unsigned long Qi Zheng
@ 2026-03-24 12:20 ` Lorenzo Stoakes (Oracle)
0 siblings, 0 replies; 23+ messages in thread
From: Lorenzo Stoakes (Oracle) @ 2026-03-24 12:20 UTC (permalink / raw)
To: Qi Zheng
Cc: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, ziy, harry.yoo, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642,
linux-mm, linux-kernel, Qi Zheng
(-cc old mail)
On Tue, Mar 24, 2026 at 07:31:27PM +0800, Qi Zheng wrote:
> From: Qi Zheng <zhengqi.arch@bytedance.com>
>
> Now, the memcg_rstat_updated() is for vmstats_percpu->state and
Now? Did this change? If so, please put commit here in commit xxx ("blah")
format, I don't want to have to try and look it up :P
> lruvec_stats_percpu->state, which are both of type long, so let's change
> the type of stats_updates to unsigned long as well.
Is this a bug whereby before this could be overflowed?
Or are you deciding to make these long now? Because it seems that are
proactively making this change _yourself_.
This comment message needs a lot more explanation.
>
> Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
> ---
> mm/memcontrol.c | 18 +++++++++---------
> 1 file changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index a47fb68dd65f1..7fb9cbc10dfbb 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -608,7 +608,7 @@ static inline int memcg_events_index(enum vm_event_item idx)
>
> struct memcg_vmstats_percpu {
> /* Stats updates since the last flush */
> - unsigned int stats_updates;
> + unsigned long stats_updates;
>
> /* Cached pointers for fast iteration in memcg_rstat_updated() */
> struct memcg_vmstats_percpu __percpu *parent_pcpu;
> @@ -639,7 +639,7 @@ struct memcg_vmstats {
> unsigned long events_pending[NR_MEMCG_EVENTS];
>
> /* Stats updates since the last flush */
> - atomic_t stats_updates;
> + atomic_long_t stats_updates;
> };
>
> /*
> @@ -665,16 +665,16 @@ static u64 flush_last_time;
>
> static bool memcg_vmstats_needs_flush(struct memcg_vmstats *vmstats)
> {
> - return atomic_read(&vmstats->stats_updates) >
> + return atomic_long_read(&vmstats->stats_updates) >
> MEMCG_CHARGE_BATCH * num_online_cpus();
> }
>
> -static inline void memcg_rstat_updated(struct mem_cgroup *memcg, int val,
> +static inline void memcg_rstat_updated(struct mem_cgroup *memcg, long val,
> int cpu)
> {
> struct memcg_vmstats_percpu __percpu *statc_pcpu;
> struct memcg_vmstats_percpu *statc;
> - unsigned int stats_updates;
> + unsigned long stats_updates;
>
> if (!val)
> return;
> @@ -697,7 +697,7 @@ static inline void memcg_rstat_updated(struct mem_cgroup *memcg, int val,
> continue;
>
> stats_updates = this_cpu_xchg(statc_pcpu->stats_updates, 0);
> - atomic_add(stats_updates, &statc->vmstats->stats_updates);
> + atomic_long_add(stats_updates, &statc->vmstats->stats_updates);
> }
> }
>
> @@ -705,7 +705,7 @@ static void __mem_cgroup_flush_stats(struct mem_cgroup *memcg, bool force)
> {
> bool needs_flush = memcg_vmstats_needs_flush(memcg->vmstats);
>
> - trace_memcg_flush_stats(memcg, atomic_read(&memcg->vmstats->stats_updates),
> + trace_memcg_flush_stats(memcg, atomic_long_read(&memcg->vmstats->stats_updates),
> force, needs_flush);
>
> if (!force && !needs_flush)
> @@ -4406,8 +4406,8 @@ static void mem_cgroup_css_rstat_flush(struct cgroup_subsys_state *css, int cpu)
> }
> WRITE_ONCE(statc->stats_updates, 0);
> /* We are in a per-cpu loop here, only do the atomic write once */
> - if (atomic_read(&memcg->vmstats->stats_updates))
> - atomic_set(&memcg->vmstats->stats_updates, 0);
> + if (atomic_long_read(&memcg->vmstats->stats_updates))
> + atomic_long_set(&memcg->vmstats->stats_updates, 0);
> }
>
> static void mem_cgroup_fork(struct task_struct *task)
> --
> 2.20.1
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state()
2026-03-24 11:31 ` [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state() Qi Zheng
@ 2026-03-24 12:21 ` Lorenzo Stoakes (Oracle)
2026-03-24 14:12 ` Matthew Wilcox
2026-03-25 1:43 ` Harry Yoo (Oracle)
1 sibling, 1 reply; 23+ messages in thread
From: Lorenzo Stoakes (Oracle) @ 2026-03-24 12:21 UTC (permalink / raw)
To: Qi Zheng
Cc: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, harry.yoo, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642,
linux-mm, linux-kernel, Qi Zheng
On Tue, Mar 24, 2026 at 07:31:28PM +0800, Qi Zheng wrote:
> From: Qi Zheng <zhengqi.arch@bytedance.com>
>
> The __mod_memcg_state() and __mod_memcg_lruvec_state() were used to
> reparent non-hierarchical stats, the values passed to them might exceed
> the upper limit of the type int, so correct the val parameter type of them
Why might they? What precipitated this change?
> to long.
Why is it a signed value?
>
> Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
> ---
> include/trace/events/memcg.h | 10 +++++-----
> mm/memcontrol.c | 8 ++++----
> 2 files changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/include/trace/events/memcg.h b/include/trace/events/memcg.h
> index dfe2f51019b4c..51b62c5931fc2 100644
> --- a/include/trace/events/memcg.h
> +++ b/include/trace/events/memcg.h
> @@ -11,14 +11,14 @@
>
> DECLARE_EVENT_CLASS(memcg_rstat_stats,
>
> - TP_PROTO(struct mem_cgroup *memcg, int item, int val),
> + TP_PROTO(struct mem_cgroup *memcg, int item, long val),
>
> TP_ARGS(memcg, item, val),
>
> TP_STRUCT__entry(
> __field(u64, id)
> __field(int, item)
> - __field(int, val)
> + __field(long, val)
> ),
>
> TP_fast_assign(
> @@ -27,20 +27,20 @@ DECLARE_EVENT_CLASS(memcg_rstat_stats,
> __entry->val = val;
> ),
>
> - TP_printk("memcg_id=%llu item=%d val=%d",
> + TP_printk("memcg_id=%llu item=%d val=%ld",
> __entry->id, __entry->item, __entry->val)
> );
>
> DEFINE_EVENT(memcg_rstat_stats, mod_memcg_state,
>
> - TP_PROTO(struct mem_cgroup *memcg, int item, int val),
> + TP_PROTO(struct mem_cgroup *memcg, int item, long val),
>
> TP_ARGS(memcg, item, val)
> );
>
> DEFINE_EVENT(memcg_rstat_stats, mod_memcg_lruvec_state,
>
> - TP_PROTO(struct mem_cgroup *memcg, int item, int val),
> + TP_PROTO(struct mem_cgroup *memcg, int item, long val),
>
> TP_ARGS(memcg, item, val)
> );
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index 7fb9cbc10dfbb..4a78550f6174e 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -527,7 +527,7 @@ unsigned long lruvec_page_state_local(struct lruvec *lruvec,
>
> #ifdef CONFIG_MEMCG_V1
> static void __mod_memcg_lruvec_state(struct mem_cgroup_per_node *pn,
> - enum node_stat_item idx, int val);
> + enum node_stat_item idx, long val);
>
> void reparent_memcg_lruvec_state_local(struct mem_cgroup *memcg,
> struct mem_cgroup *parent, int idx)
> @@ -784,7 +784,7 @@ static int memcg_page_state_unit(int item);
> * Normalize the value passed into memcg_rstat_updated() to be in pages. Round
> * up non-zero sub-page updates to 1 page as zero page updates are ignored.
> */
> -static int memcg_state_val_in_pages(int idx, int val)
> +static long memcg_state_val_in_pages(int idx, long val)
> {
> int unit = memcg_page_state_unit(idx);
>
> @@ -831,7 +831,7 @@ static inline void get_non_dying_memcg_end(void)
> #endif
>
> static void __mod_memcg_state(struct mem_cgroup *memcg,
> - enum memcg_stat_item idx, int val)
> + enum memcg_stat_item idx, long val)
> {
> int i = memcg_stats_index(idx);
> int cpu;
> @@ -896,7 +896,7 @@ void reparent_memcg_state_local(struct mem_cgroup *memcg,
> #endif
>
> static void __mod_memcg_lruvec_state(struct mem_cgroup_per_node *pn,
> - enum node_stat_item idx, int val)
> + enum node_stat_item idx, long val)
> {
> struct mem_cgroup *memcg = pn->memcg;
> int i = memcg_stats_index(idx);
> --
> 2.20.1
>
Cheers, Lorenzo
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 3/3] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size()
2026-03-24 11:31 ` [PATCH 3/3] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size() Qi Zheng
@ 2026-03-24 12:28 ` Lorenzo Stoakes (Oracle)
2026-03-25 0:27 ` Harry Yoo (Oracle)
2026-03-26 2:35 ` kernel test robot
1 sibling, 1 reply; 23+ messages in thread
From: Lorenzo Stoakes (Oracle) @ 2026-03-24 12:28 UTC (permalink / raw)
To: Qi Zheng
Cc: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, harry.yoo, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642,
linux-mm, linux-kernel, Qi Zheng
On Tue, Mar 24, 2026 at 07:31:29PM +0800, Qi Zheng wrote:
> From: Qi Zheng <zhengqi.arch@bytedance.com>
>
> The nr_pages parameter of mem_cgroup_update_lru_size() should clearly
> be long instead of int, let's correct it.
Hmm, but are you ever going to be adding that many pages? I guess technically
correct though.
You should list all the callers and how they use long or unsigned long,
e.g. update_lru_sizes(), lruvec_reparent_lru(), lru_gen_reparent_memcg().
And maybe look a bit into why this was int, if there's any reason for it at
all :)
I'm assuming there's no weird 'let's intentionally let this overflow'
behaviour here.
>
> Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
This one looks correct overall, so, with commit message improved:
Reviewed-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org>
> ---
> include/linux/memcontrol.h | 2 +-
> mm/memcontrol.c | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> index 0861589695298..dc3fa687759b4 100644
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -878,7 +878,7 @@ static inline bool mem_cgroup_online(struct mem_cgroup *memcg)
> }
>
> void mem_cgroup_update_lru_size(struct lruvec *lruvec, enum lru_list lru,
> - int zid, int nr_pages);
> + int zid, long nr_pages);
>
> static inline
> unsigned long mem_cgroup_get_zone_lru_size(struct lruvec *lruvec,
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index 4a78550f6174e..6491ca74b3398 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -1466,7 +1466,7 @@ struct lruvec *folio_lruvec_lock_irqsave(struct folio *folio,
> * to or just after a page is removed from an lru list.
> */
> void mem_cgroup_update_lru_size(struct lruvec *lruvec, enum lru_list lru,
> - int zid, int nr_pages)
> + int zid, long nr_pages)
> {
> struct mem_cgroup_per_node *mz;
> unsigned long *lru_size;
> --
> 2.20.1
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state()
2026-03-24 12:21 ` Lorenzo Stoakes (Oracle)
@ 2026-03-24 14:12 ` Matthew Wilcox
2026-03-24 14:24 ` Lorenzo Stoakes (Oracle)
0 siblings, 1 reply; 23+ messages in thread
From: Matthew Wilcox @ 2026-03-24 14:12 UTC (permalink / raw)
To: Lorenzo Stoakes (Oracle)
Cc: Qi Zheng, hannes, hughd, mhocko, roman.gushchin, shakeel.butt,
muchun.song, david, lorenzo.stoakes, ziy, harry.yoo, yosry.ahmed,
imran.f.khan, kamalesh.babulal, axelrasmussen, yuanchu, weixugc,
chenridong, mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe,
usamaarif642, linux-mm, linux-kernel, Qi Zheng
On Tue, Mar 24, 2026 at 12:21:06PM +0000, Lorenzo Stoakes (Oracle) wrote:
> On Tue, Mar 24, 2026 at 07:31:28PM +0800, Qi Zheng wrote:
> > From: Qi Zheng <zhengqi.arch@bytedance.com>
> >
> > The __mod_memcg_state() and __mod_memcg_lruvec_state() were used to
> > reparent non-hierarchical stats, the values passed to them might exceed
> > the upper limit of the type int, so correct the val parameter type of them
>
> Why might they? What precipitated this change?
>
> > to long.
>
> Why is it a signed value?
Because 'mod' can both increase and decrease this counter. It must be
signed.
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state()
2026-03-24 14:12 ` Matthew Wilcox
@ 2026-03-24 14:24 ` Lorenzo Stoakes (Oracle)
0 siblings, 0 replies; 23+ messages in thread
From: Lorenzo Stoakes (Oracle) @ 2026-03-24 14:24 UTC (permalink / raw)
To: Matthew Wilcox
Cc: Qi Zheng, hannes, hughd, mhocko, roman.gushchin, shakeel.butt,
muchun.song, david, lorenzo.stoakes, ziy, harry.yoo, yosry.ahmed,
imran.f.khan, kamalesh.babulal, axelrasmussen, yuanchu, weixugc,
chenridong, mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe,
usamaarif642, linux-mm, linux-kernel, Qi Zheng
On Tue, Mar 24, 2026 at 02:12:00PM +0000, Matthew Wilcox wrote:
> On Tue, Mar 24, 2026 at 12:21:06PM +0000, Lorenzo Stoakes (Oracle) wrote:
> > On Tue, Mar 24, 2026 at 07:31:28PM +0800, Qi Zheng wrote:
> > > From: Qi Zheng <zhengqi.arch@bytedance.com>
> > >
> > > The __mod_memcg_state() and __mod_memcg_lruvec_state() were used to
> > > reparent non-hierarchical stats, the values passed to them might exceed
> > > the upper limit of the type int, so correct the val parameter type of them
> >
> > Why might they? What precipitated this change?
> >
> > > to long.
> >
> > Why is it a signed value?
>
> Because 'mod' can both increase and decrease this counter. It must be
> signed.
Right yeah noticed that in another patch :)
Cheers, Lorenzo
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 3/3] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size()
2026-03-24 12:28 ` Lorenzo Stoakes (Oracle)
@ 2026-03-25 0:27 ` Harry Yoo (Oracle)
2026-03-25 3:34 ` Qi Zheng
0 siblings, 1 reply; 23+ messages in thread
From: Harry Yoo (Oracle) @ 2026-03-25 0:27 UTC (permalink / raw)
To: Lorenzo Stoakes (Oracle)
Cc: Qi Zheng, hannes, hughd, mhocko, roman.gushchin, shakeel.butt,
muchun.song, david, lorenzo.stoakes, ziy, yosry.ahmed,
imran.f.khan, kamalesh.babulal, axelrasmussen, yuanchu, weixugc,
chenridong, mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe,
usamaarif642, linux-mm, linux-kernel, Qi Zheng
On Tue, Mar 24, 2026 at 12:28:08PM +0000, Lorenzo Stoakes (Oracle) wrote:
> On Tue, Mar 24, 2026 at 07:31:29PM +0800, Qi Zheng wrote:
> > From: Qi Zheng <zhengqi.arch@bytedance.com>
> >
> > The nr_pages parameter of mem_cgroup_update_lru_size() should clearly
> > be long instead of int, let's correct it.
>
> Hmm, but are you ever going to be adding that many pages? I guess technically
> correct though.
It has been fine as-is, but reparenting changes that.
Reparenting in theory could add billions of pages at once!
And yeah the commit message could be improved.
--
Cheers,
Harry / Hyeonggon
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state()
2026-03-24 11:31 ` [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state() Qi Zheng
2026-03-24 12:21 ` Lorenzo Stoakes (Oracle)
@ 2026-03-25 1:43 ` Harry Yoo (Oracle)
2026-03-25 3:25 ` Qi Zheng
2026-03-26 7:49 ` Harry Yoo (Oracle)
1 sibling, 2 replies; 23+ messages in thread
From: Harry Yoo (Oracle) @ 2026-03-25 1:43 UTC (permalink / raw)
To: Qi Zheng
Cc: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642,
linux-mm, linux-kernel, Qi Zheng
On Tue, Mar 24, 2026 at 07:31:28PM +0800, Qi Zheng wrote:
> From: Qi Zheng <zhengqi.arch@bytedance.com>
>
> The __mod_memcg_state() and __mod_memcg_lruvec_state() were used to
> reparent non-hierarchical stats, the values passed to them might exceed
> the upper limit of the type int, so correct the val parameter type of them
> to long.
>
> Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
> ---
> include/trace/events/memcg.h | 10 +++++-----
> mm/memcontrol.c | 8 ++++----
> 2 files changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index 7fb9cbc10dfbb..4a78550f6174e 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -527,7 +527,7 @@ unsigned long lruvec_page_state_local(struct lruvec *lruvec,
>
> #ifdef CONFIG_MEMCG_V1
> static void __mod_memcg_lruvec_state(struct mem_cgroup_per_node *pn,
> - enum node_stat_item idx, int val);
> + enum node_stat_item idx, long val);
>
> void reparent_memcg_lruvec_state_local(struct mem_cgroup *memcg,
> struct mem_cgroup *parent, int idx)
> @@ -784,7 +784,7 @@ static int memcg_page_state_unit(int item);
> * Normalize the value passed into memcg_rstat_updated() to be in pages. Round
> * up non-zero sub-page updates to 1 page as zero page updates are ignored.
> */
> -static int memcg_state_val_in_pages(int idx, int val)
> +static long memcg_state_val_in_pages(int idx, long val)
> {
> int unit = memcg_page_state_unit(idx);
Sashiko AI made an interesting argument [1] that this could lead to
incorrectly returning a very large positive number. Let me verify that.
[1] https://sashiko.dev/#/patchset/cover.1774342371.git.zhengqi.arch%40bytedance.com
Sashiko wrote:
> Does this change inadvertently break the handling of negative byte-sized
> updates?
> Looking at the rest of the function:
> if (!val || unit == PAGE_SIZE)
> return val;
> else
> return max(val * unit / PAGE_SIZE, 1UL);
> PAGE_SIZE is defined as an unsigned long.
Right, it's defined as 1UL << PAGE_SHIFT.
> When val is negative, such as during uncharging of byte-sized stats like
> MEMCG_ZSWAP_B, the expression val * unit is a negative long.
Right.
> Dividing a signed long by an unsigned long causes the signed long to be
> promoted to unsigned before division,
Right.
> resulting in a massive positive
> number instead of a small negative one.
Let's look at an example (assuming unit is 1).
val = val * unit = -16384 (-16 KiB)
val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
max(0x3FFFFFFFFFFFFF, 1UL) = 0x3FFFFFFFFFF
Yeah, that's a massive positive number.
Hmm but how did it work when it was int?
val = val * unit = -16384 (-16KiB)
val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
max(val * unit / PAGE_SIZE, 1UL) = 0x3FFFFFFFFFFFFF
(int)0x3FFFFFFFFFFFFF = 0xFFFFFFFF = (-1)
That's incorrect. It should have been -4?
> Before this change, the function returned an int, which implicitly truncated
> the massive unsigned 64-bit result to a 32-bit int, accidentally yielding the
> correct negative arithmetic value.
So... "accidentally yielding the correct negative arithemetic value"
is wrong.
Sounds like it's been subtly broken even before this patch and nobody
noticed.
> By changing the return type to long, this implicit truncation is removed,
> and the huge positive value is returned unaltered.
That's true.
> Could this corrupt tracepoint logs when passed to trace_mod_memcg_state?
I'm not sure if that's critical but yeah that's true.
> Also, would passing this huge positive value to memcg_rstat_updated instantly
> exceed the charge batch threshold and trigger endless, expensive global
> cgroup_rstat flushing, severely degrading system performance?
It would lead to more frequent flushes, at least.
--
Cheers,
Harry / Hyeonggon
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state()
2026-03-25 1:43 ` Harry Yoo (Oracle)
@ 2026-03-25 3:25 ` Qi Zheng
2026-03-25 5:17 ` Harry Yoo (Oracle)
2026-03-26 7:49 ` Harry Yoo (Oracle)
1 sibling, 1 reply; 23+ messages in thread
From: Qi Zheng @ 2026-03-25 3:25 UTC (permalink / raw)
To: Harry Yoo (Oracle)
Cc: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642,
linux-mm, linux-kernel, Qi Zheng
On 3/25/26 9:43 AM, Harry Yoo (Oracle) wrote:
> On Tue, Mar 24, 2026 at 07:31:28PM +0800, Qi Zheng wrote:
>> From: Qi Zheng <zhengqi.arch@bytedance.com>
>>
>> The __mod_memcg_state() and __mod_memcg_lruvec_state() were used to
>> reparent non-hierarchical stats, the values passed to them might exceed
>> the upper limit of the type int, so correct the val parameter type of them
>> to long.
>>
>> Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
>> ---
>> include/trace/events/memcg.h | 10 +++++-----
>> mm/memcontrol.c | 8 ++++----
>> 2 files changed, 9 insertions(+), 9 deletions(-)
>>
>> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
>> index 7fb9cbc10dfbb..4a78550f6174e 100644
>> --- a/mm/memcontrol.c
>> +++ b/mm/memcontrol.c
>> @@ -527,7 +527,7 @@ unsigned long lruvec_page_state_local(struct lruvec *lruvec,
>>
>> #ifdef CONFIG_MEMCG_V1
>> static void __mod_memcg_lruvec_state(struct mem_cgroup_per_node *pn,
>> - enum node_stat_item idx, int val);
>> + enum node_stat_item idx, long val);
>>
>> void reparent_memcg_lruvec_state_local(struct mem_cgroup *memcg,
>> struct mem_cgroup *parent, int idx)
>> @@ -784,7 +784,7 @@ static int memcg_page_state_unit(int item);
>> * Normalize the value passed into memcg_rstat_updated() to be in pages. Round
>> * up non-zero sub-page updates to 1 page as zero page updates are ignored.
>> */
>> -static int memcg_state_val_in_pages(int idx, int val)
>> +static long memcg_state_val_in_pages(int idx, long val)
>> {
>> int unit = memcg_page_state_unit(idx);
>
> Sashiko AI made an interesting argument [1] that this could lead to
> incorrectly returning a very large positive number. Let me verify that.
>
> [1] https://sashiko.dev/#/patchset/cover.1774342371.git.zhengqi.arch%40bytedance.com
>
> Sashiko wrote:
>> Does this change inadvertently break the handling of negative byte-sized
>> updates?
>> Looking at the rest of the function:
>> if (!val || unit == PAGE_SIZE)
>> return val;
>> else
>> return max(val * unit / PAGE_SIZE, 1UL);
>
>> PAGE_SIZE is defined as an unsigned long.
>
> Right, it's defined as 1UL << PAGE_SHIFT.
>
>> When val is negative, such as during uncharging of byte-sized stats like
>> MEMCG_ZSWAP_B, the expression val * unit is a negative long.
>
> Right.
>
>> Dividing a signed long by an unsigned long causes the signed long to be
>> promoted to unsigned before division,
>
> Right.
>
>> resulting in a massive positive
>> number instead of a small negative one.
>
> Let's look at an example (assuming unit is 1).
>
> val = val * unit = -16384 (-16 KiB)
> val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
> max(0x3FFFFFFFFFFFFF, 1UL) = 0x3FFFFFFFFFF
>
> Yeah, that's a massive positive number.
>
> Hmm but how did it work when it was int?
>
> val = val * unit = -16384 (-16KiB)
> val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
> max(val * unit / PAGE_SIZE, 1UL) = 0x3FFFFFFFFFFFFF
> (int)0x3FFFFFFFFFFFFF = 0xFFFFFFFF = (-1)
>
> That's incorrect. It should have been -4?
>
>> Before this change, the function returned an int, which implicitly truncated
>> the massive unsigned 64-bit result to a 32-bit int, accidentally yielding the
>> correct negative arithmetic value.
>
> So... "accidentally yielding the correct negative arithemetic value"
> is wrong.
>
> Sounds like it's been subtly broken even before this patch and nobody
> noticed.
Thank you for such a detailed analysis! And I think you are right.
The memcg_state_val_in_pages() is only to make @val to be in pages, so
perhaps we can avoid the above problem by taking the absolute value
first?
Thanks,
Qi
>
>> By changing the return type to long, this implicit truncation is removed,
>> and the huge positive value is returned unaltered.
>
> That's true.
>
>> Could this corrupt tracepoint logs when passed to trace_mod_memcg_state?
>
> I'm not sure if that's critical but yeah that's true.
>
>> Also, would passing this huge positive value to memcg_rstat_updated instantly
>> exceed the charge batch threshold and trigger endless, expensive global
>> cgroup_rstat flushing, severely degrading system performance?
>
> It would lead to more frequent flushes, at least.
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 3/3] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size()
2026-03-25 0:27 ` Harry Yoo (Oracle)
@ 2026-03-25 3:34 ` Qi Zheng
0 siblings, 0 replies; 23+ messages in thread
From: Qi Zheng @ 2026-03-25 3:34 UTC (permalink / raw)
To: Harry Yoo (Oracle), Lorenzo Stoakes (Oracle)
Cc: Qi Zheng, hannes, hughd, mhocko, roman.gushchin, shakeel.butt,
muchun.song, david, lorenzo.stoakes, ziy, yosry.ahmed,
imran.f.khan, kamalesh.babulal, axelrasmussen, yuanchu, weixugc,
chenridong, mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe,
usamaarif642, linux-mm, linux-kernel, Qi Zheng
On 3/25/26 8:27 AM, Harry Yoo (Oracle) wrote:
> On Tue, Mar 24, 2026 at 12:28:08PM +0000, Lorenzo Stoakes (Oracle) wrote:
>> On Tue, Mar 24, 2026 at 07:31:29PM +0800, Qi Zheng wrote:
>>> From: Qi Zheng <zhengqi.arch@bytedance.com>
>>>
>>> The nr_pages parameter of mem_cgroup_update_lru_size() should clearly
>>> be long instead of int, let's correct it.
>>
>> Hmm, but are you ever going to be adding that many pages? I guess technically
>> correct though.
>
> It has been fine as-is, but reparenting changes that.
> Reparenting in theory could add billions of pages at once!
Right. Thanks for the explanation!
>
> And yeah the commit message could be improved.
Yes, I've omitted a lot of background information, which might seem
abrupt to some reviewers unfamiliar with it. I will improve this in the
next version.
Thanks,
Qi
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state()
2026-03-25 3:25 ` Qi Zheng
@ 2026-03-25 5:17 ` Harry Yoo (Oracle)
2026-03-25 7:26 ` Qi Zheng
0 siblings, 1 reply; 23+ messages in thread
From: Harry Yoo (Oracle) @ 2026-03-25 5:17 UTC (permalink / raw)
To: Qi Zheng
Cc: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642,
linux-mm, linux-kernel, Qi Zheng
On Wed, Mar 25, 2026 at 11:25:06AM +0800, Qi Zheng wrote:
> On 3/25/26 9:43 AM, Harry Yoo (Oracle) wrote:
> > On Tue, Mar 24, 2026 at 07:31:28PM +0800, Qi Zheng wrote:
> > > From: Qi Zheng <zhengqi.arch@bytedance.com>
> > >
> > > The __mod_memcg_state() and __mod_memcg_lruvec_state() were used to
> > > reparent non-hierarchical stats, the values passed to them might exceed
> > > the upper limit of the type int, so correct the val parameter type of them
> > > to long.
> > >
> > > Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
> > > ---
> > > include/trace/events/memcg.h | 10 +++++-----
> > > mm/memcontrol.c | 8 ++++----
> > > 2 files changed, 9 insertions(+), 9 deletions(-)
> > >
> > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> > > index 7fb9cbc10dfbb..4a78550f6174e 100644
> > > --- a/mm/memcontrol.c
> > > +++ b/mm/memcontrol.c
> > > @@ -527,7 +527,7 @@ unsigned long lruvec_page_state_local(struct lruvec *lruvec,
> > > #ifdef CONFIG_MEMCG_V1
> > > static void __mod_memcg_lruvec_state(struct mem_cgroup_per_node *pn,
> > > - enum node_stat_item idx, int val);
> > > + enum node_stat_item idx, long val);
> > > void reparent_memcg_lruvec_state_local(struct mem_cgroup *memcg,
> > > struct mem_cgroup *parent, int idx)
> > > @@ -784,7 +784,7 @@ static int memcg_page_state_unit(int item);
> > > * Normalize the value passed into memcg_rstat_updated() to be in pages. Round
> > > * up non-zero sub-page updates to 1 page as zero page updates are ignored.
> > > */
> > > -static int memcg_state_val_in_pages(int idx, int val)
> > > +static long memcg_state_val_in_pages(int idx, long val)
> > > {
> > > int unit = memcg_page_state_unit(idx);
> >
> > Sashiko AI made an interesting argument [1] that this could lead to
> > incorrectly returning a very large positive number. Let me verify that.
> >
> > [1] https://sashiko.dev/#/patchset/cover.1774342371.git.zhengqi.arch%40bytedance.com
> >
> > Sashiko wrote:
> > > Does this change inadvertently break the handling of negative byte-sized
> > > updates?
> > > Looking at the rest of the function:
> > > if (!val || unit == PAGE_SIZE)
> > > return val;
> > > else
> > > return max(val * unit / PAGE_SIZE, 1UL);
> >
> > > PAGE_SIZE is defined as an unsigned long.
> >
> > Right, it's defined as 1UL << PAGE_SHIFT.
> >
> > > When val is negative, such as during uncharging of byte-sized stats like
> > > MEMCG_ZSWAP_B, the expression val * unit is a negative long.
> >
> > Right.
> >
> > > Dividing a signed long by an unsigned long causes the signed long to be
> > > promoted to unsigned before division,
> >
> > Right.
> >
> > > resulting in a massive positive
> > > number instead of a small negative one.
> >
> > Let's look at an example (assuming unit is 1).
> >
> > val = val * unit = -16384 (-16 KiB)
> > val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
> > max(0x3FFFFFFFFFFFFF, 1UL) = 0x3FFFFFFFFFF
> >
> > Yeah, that's a massive positive number.
> >
> > Hmm but how did it work when it was int?
> >
> > val = val * unit = -16384 (-16KiB)
> > val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
> > max(val * unit / PAGE_SIZE, 1UL) = 0x3FFFFFFFFFFFFF
> > (int)0x3FFFFFFFFFFFFF = 0xFFFFFFFF = (-1)
> >
> > That's incorrect. It should have been -4?
> >
> > > Before this change, the function returned an int, which implicitly truncated
> > > the massive unsigned 64-bit result to a 32-bit int, accidentally yielding the
> > > correct negative arithmetic value.
> >
> > So... "accidentally yielding the correct negative arithemetic value"
> > is wrong.
> >
> > Sounds like it's been subtly broken even before this patch and nobody
> > noticed.
>
> Thank you for such a detailed analysis! And I think you are right.
No problem ;)
> The memcg_state_val_in_pages() is only to make @val to be in pages, so
> perhaps we can avoid the above problem by taking the absolute value
> first?
That would work for memcg_rstat_updated(),
but not for trace_mod_memcg_state()?
--
Cheers,
Harry / Hyeonggon
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state()
2026-03-25 5:17 ` Harry Yoo (Oracle)
@ 2026-03-25 7:26 ` Qi Zheng
2026-03-25 7:36 ` Harry Yoo (Oracle)
0 siblings, 1 reply; 23+ messages in thread
From: Qi Zheng @ 2026-03-25 7:26 UTC (permalink / raw)
To: Harry Yoo (Oracle)
Cc: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642,
linux-mm, linux-kernel, Qi Zheng
On 3/25/26 1:17 PM, Harry Yoo (Oracle) wrote:
> On Wed, Mar 25, 2026 at 11:25:06AM +0800, Qi Zheng wrote:
>> On 3/25/26 9:43 AM, Harry Yoo (Oracle) wrote:
>>> On Tue, Mar 24, 2026 at 07:31:28PM +0800, Qi Zheng wrote:
>>>> From: Qi Zheng <zhengqi.arch@bytedance.com>
>>>>
>>>> The __mod_memcg_state() and __mod_memcg_lruvec_state() were used to
>>>> reparent non-hierarchical stats, the values passed to them might exceed
>>>> the upper limit of the type int, so correct the val parameter type of them
>>>> to long.
>>>>
>>>> Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
>>>> ---
>>>> include/trace/events/memcg.h | 10 +++++-----
>>>> mm/memcontrol.c | 8 ++++----
>>>> 2 files changed, 9 insertions(+), 9 deletions(-)
>>>>
>>>> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
>>>> index 7fb9cbc10dfbb..4a78550f6174e 100644
>>>> --- a/mm/memcontrol.c
>>>> +++ b/mm/memcontrol.c
>>>> @@ -527,7 +527,7 @@ unsigned long lruvec_page_state_local(struct lruvec *lruvec,
>>>> #ifdef CONFIG_MEMCG_V1
>>>> static void __mod_memcg_lruvec_state(struct mem_cgroup_per_node *pn,
>>>> - enum node_stat_item idx, int val);
>>>> + enum node_stat_item idx, long val);
>>>> void reparent_memcg_lruvec_state_local(struct mem_cgroup *memcg,
>>>> struct mem_cgroup *parent, int idx)
>>>> @@ -784,7 +784,7 @@ static int memcg_page_state_unit(int item);
>>>> * Normalize the value passed into memcg_rstat_updated() to be in pages. Round
>>>> * up non-zero sub-page updates to 1 page as zero page updates are ignored.
>>>> */
>>>> -static int memcg_state_val_in_pages(int idx, int val)
>>>> +static long memcg_state_val_in_pages(int idx, long val)
>>>> {
>>>> int unit = memcg_page_state_unit(idx);
>>>
>>> Sashiko AI made an interesting argument [1] that this could lead to
>>> incorrectly returning a very large positive number. Let me verify that.
>>>
>>> [1] https://sashiko.dev/#/patchset/cover.1774342371.git.zhengqi.arch%40bytedance.com
>>>
>>> Sashiko wrote:
>>>> Does this change inadvertently break the handling of negative byte-sized
>>>> updates?
>>>> Looking at the rest of the function:
>>>> if (!val || unit == PAGE_SIZE)
>>>> return val;
>>>> else
>>>> return max(val * unit / PAGE_SIZE, 1UL);
>>>
>>>> PAGE_SIZE is defined as an unsigned long.
>>>
>>> Right, it's defined as 1UL << PAGE_SHIFT.
>>>
>>>> When val is negative, such as during uncharging of byte-sized stats like
>>>> MEMCG_ZSWAP_B, the expression val * unit is a negative long.
>>>
>>> Right.
>>>
>>>> Dividing a signed long by an unsigned long causes the signed long to be
>>>> promoted to unsigned before division,
>>>
>>> Right.
>>>
>>>> resulting in a massive positive
>>>> number instead of a small negative one.
>>>
>>> Let's look at an example (assuming unit is 1).
>>>
>>> val = val * unit = -16384 (-16 KiB)
>>> val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
>>> max(0x3FFFFFFFFFFFFF, 1UL) = 0x3FFFFFFFFFF
>>>
>>> Yeah, that's a massive positive number.
>>>
>>> Hmm but how did it work when it was int?
>>>
>>> val = val * unit = -16384 (-16KiB)
>>> val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
>>> max(val * unit / PAGE_SIZE, 1UL) = 0x3FFFFFFFFFFFFF
>>> (int)0x3FFFFFFFFFFFFF = 0xFFFFFFFF = (-1)
>>>
>>> That's incorrect. It should have been -4?
>>>
>>>> Before this change, the function returned an int, which implicitly truncated
>>>> the massive unsigned 64-bit result to a 32-bit int, accidentally yielding the
>>>> correct negative arithmetic value.
>>>
>>> So... "accidentally yielding the correct negative arithemetic value"
>>> is wrong.
>>>
>>> Sounds like it's been subtly broken even before this patch and nobody
>>> noticed.
>>
>> Thank you for such a detailed analysis! And I think you are right.
>
> No problem ;)
>
>> The memcg_state_val_in_pages() is only to make @val to be in pages, so
>> perhaps we can avoid the above problem by taking the absolute value
>> first?
For more clearly, here is the diff:
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 6491ca74b3398..2b34805b01476 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -787,11 +787,17 @@ static int memcg_page_state_unit(int item);
static long memcg_state_val_in_pages(int idx, long val)
{
int unit = memcg_page_state_unit(idx);
+ unsigned long uval;
+ long res;
if (!val || unit == PAGE_SIZE)
return val;
- else
- return max(val * unit / PAGE_SIZE, 1UL);
+
+ uval = val < 0 ? -(unsigned long)val : (unsigned long)val;
+
+ res = max(mult_frac(uval, unit, PAGE_SIZE), 1UL);
+
+ return val < 0 ? -res : res;
}
#ifdef CONFIG_MEMCG_V1
>
> That would work for memcg_rstat_updated(),
> but not for trace_mod_memcg_state()?
Why? The trace_mod_memcg_state() seems to accept 'long' type,
am I missing something?
Thanks,
Qi
>
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state()
2026-03-25 7:26 ` Qi Zheng
@ 2026-03-25 7:36 ` Harry Yoo (Oracle)
2026-03-25 7:39 ` Qi Zheng
0 siblings, 1 reply; 23+ messages in thread
From: Harry Yoo (Oracle) @ 2026-03-25 7:36 UTC (permalink / raw)
To: Qi Zheng
Cc: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642,
linux-mm, linux-kernel, Qi Zheng
On Wed, Mar 25, 2026 at 03:26:46PM +0800, Qi Zheng wrote:
>
>
> On 3/25/26 1:17 PM, Harry Yoo (Oracle) wrote:
> > On Wed, Mar 25, 2026 at 11:25:06AM +0800, Qi Zheng wrote:
> > > On 3/25/26 9:43 AM, Harry Yoo (Oracle) wrote:
> > > > On Tue, Mar 24, 2026 at 07:31:28PM +0800, Qi Zheng wrote:
> > > > > From: Qi Zheng <zhengqi.arch@bytedance.com>
> > > > >
> > > > > The __mod_memcg_state() and __mod_memcg_lruvec_state() were used to
> > > > > reparent non-hierarchical stats, the values passed to them might exceed
> > > > > the upper limit of the type int, so correct the val parameter type of them
> > > > > to long.
> > > > >
> > > > > Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
> > > > > ---
> > > > > include/trace/events/memcg.h | 10 +++++-----
> > > > > mm/memcontrol.c | 8 ++++----
> > > > > 2 files changed, 9 insertions(+), 9 deletions(-)
> > > > >
> > > > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> > > > > index 7fb9cbc10dfbb..4a78550f6174e 100644
> > > > > --- a/mm/memcontrol.c
> > > > > +++ b/mm/memcontrol.c
> > > > > @@ -527,7 +527,7 @@ unsigned long lruvec_page_state_local(struct lruvec *lruvec,
> > > > > #ifdef CONFIG_MEMCG_V1
> > > > > static void __mod_memcg_lruvec_state(struct mem_cgroup_per_node *pn,
> > > > > - enum node_stat_item idx, int val);
> > > > > + enum node_stat_item idx, long val);
> > > > > void reparent_memcg_lruvec_state_local(struct mem_cgroup *memcg,
> > > > > struct mem_cgroup *parent, int idx)
> > > > > @@ -784,7 +784,7 @@ static int memcg_page_state_unit(int item);
> > > > > * Normalize the value passed into memcg_rstat_updated() to be in pages. Round
> > > > > * up non-zero sub-page updates to 1 page as zero page updates are ignored.
> > > > > */
> > > > > -static int memcg_state_val_in_pages(int idx, int val)
> > > > > +static long memcg_state_val_in_pages(int idx, long val)
> > > > > {
> > > > > int unit = memcg_page_state_unit(idx);
> > > >
> > > > Sashiko AI made an interesting argument [1] that this could lead to
> > > > incorrectly returning a very large positive number. Let me verify that.
> > > >
> > > > [1] https://sashiko.dev/#/patchset/cover.1774342371.git.zhengqi.arch%40bytedance.com
> > > >
> > > > Sashiko wrote:
> > > > > Does this change inadvertently break the handling of negative byte-sized
> > > > > updates?
> > > > > Looking at the rest of the function:
> > > > > if (!val || unit == PAGE_SIZE)
> > > > > return val;
> > > > > else
> > > > > return max(val * unit / PAGE_SIZE, 1UL);
> > > >
> > > > > PAGE_SIZE is defined as an unsigned long.
> > > >
> > > > Right, it's defined as 1UL << PAGE_SHIFT.
> > > >
> > > > > When val is negative, such as during uncharging of byte-sized stats like
> > > > > MEMCG_ZSWAP_B, the expression val * unit is a negative long.
> > > >
> > > > Right.
> > > >
> > > > > Dividing a signed long by an unsigned long causes the signed long to be
> > > > > promoted to unsigned before division,
> > > >
> > > > Right.
> > > >
> > > > > resulting in a massive positive
> > > > > number instead of a small negative one.
> > > >
> > > > Let's look at an example (assuming unit is 1).
> > > >
> > > > val = val * unit = -16384 (-16 KiB)
> > > > val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
> > > > max(0x3FFFFFFFFFFFFF, 1UL) = 0x3FFFFFFFFFF
> > > >
> > > > Yeah, that's a massive positive number.
> > > >
> > > > Hmm but how did it work when it was int?
> > > >
> > > > val = val * unit = -16384 (-16KiB)
> > > > val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
> > > > max(val * unit / PAGE_SIZE, 1UL) = 0x3FFFFFFFFFFFFF
> > > > (int)0x3FFFFFFFFFFFFF = 0xFFFFFFFF = (-1)
> > > >
> > > > That's incorrect. It should have been -4?
> > > >
> > > > > Before this change, the function returned an int, which implicitly truncated
> > > > > the massive unsigned 64-bit result to a 32-bit int, accidentally yielding the
> > > > > correct negative arithmetic value.
> > > >
> > > > So... "accidentally yielding the correct negative arithemetic value"
> > > > is wrong.
> > > >
> > > > Sounds like it's been subtly broken even before this patch and nobody
> > > > noticed.
> > >
> > > Thank you for such a detailed analysis! And I think you are right.
> >
> > No problem ;)
> >
> > > The memcg_state_val_in_pages() is only to make @val to be in pages, so
> > > perhaps we can avoid the above problem by taking the absolute value
> > > first?
>
> For more clearly, here is the diff:
>
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index 6491ca74b3398..2b34805b01476 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -787,11 +787,17 @@ static int memcg_page_state_unit(int item);
> static long memcg_state_val_in_pages(int idx, long val)
> {
> int unit = memcg_page_state_unit(idx);
> + unsigned long uval;
> + long res;
>
> if (!val || unit == PAGE_SIZE)
> return val;
> - else
> - return max(val * unit / PAGE_SIZE, 1UL);
> +
> + uval = val < 0 ? -(unsigned long)val : (unsigned long)val;
We could use abs() macro in linux/math.h here :)
val should not be LONG_MIN, but it should be fine
to assume it won't reach LONG_MIN.
> +
> + res = max(mult_frac(uval, unit, PAGE_SIZE), 1UL);
> +
> + return val < 0 ? -res : res;
> }
>
> #ifdef CONFIG_MEMCG_V1
>
> > That would work for memcg_rstat_updated(),
> > but not for trace_mod_memcg_state()?
>
> Why? The trace_mod_memcg_state() seems to accept 'long' type,
> am I missing something?
Nevermind. Without the diff, I misunderstood what you meant.
Thanks!
--
Cheers,
Harry / Hyeonggon
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state()
2026-03-25 7:36 ` Harry Yoo (Oracle)
@ 2026-03-25 7:39 ` Qi Zheng
0 siblings, 0 replies; 23+ messages in thread
From: Qi Zheng @ 2026-03-25 7:39 UTC (permalink / raw)
To: Harry Yoo (Oracle)
Cc: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642,
linux-mm, linux-kernel
On 3/25/26 3:36 PM, Harry Yoo (Oracle) wrote:
> On Wed, Mar 25, 2026 at 03:26:46PM +0800, Qi Zheng wrote:
>>
>>
>> On 3/25/26 1:17 PM, Harry Yoo (Oracle) wrote:
>>> On Wed, Mar 25, 2026 at 11:25:06AM +0800, Qi Zheng wrote:
>>>> On 3/25/26 9:43 AM, Harry Yoo (Oracle) wrote:
>>>>> On Tue, Mar 24, 2026 at 07:31:28PM +0800, Qi Zheng wrote:
>>>>>> From: Qi Zheng <zhengqi.arch@bytedance.com>
>>>>>>
>>>>>> The __mod_memcg_state() and __mod_memcg_lruvec_state() were used to
>>>>>> reparent non-hierarchical stats, the values passed to them might exceed
>>>>>> the upper limit of the type int, so correct the val parameter type of them
>>>>>> to long.
>>>>>>
>>>>>> Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
>>>>>> ---
>>>>>> include/trace/events/memcg.h | 10 +++++-----
>>>>>> mm/memcontrol.c | 8 ++++----
>>>>>> 2 files changed, 9 insertions(+), 9 deletions(-)
>>>>>>
>>>>>> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
>>>>>> index 7fb9cbc10dfbb..4a78550f6174e 100644
>>>>>> --- a/mm/memcontrol.c
>>>>>> +++ b/mm/memcontrol.c
>>>>>> @@ -527,7 +527,7 @@ unsigned long lruvec_page_state_local(struct lruvec *lruvec,
>>>>>> #ifdef CONFIG_MEMCG_V1
>>>>>> static void __mod_memcg_lruvec_state(struct mem_cgroup_per_node *pn,
>>>>>> - enum node_stat_item idx, int val);
>>>>>> + enum node_stat_item idx, long val);
>>>>>> void reparent_memcg_lruvec_state_local(struct mem_cgroup *memcg,
>>>>>> struct mem_cgroup *parent, int idx)
>>>>>> @@ -784,7 +784,7 @@ static int memcg_page_state_unit(int item);
>>>>>> * Normalize the value passed into memcg_rstat_updated() to be in pages. Round
>>>>>> * up non-zero sub-page updates to 1 page as zero page updates are ignored.
>>>>>> */
>>>>>> -static int memcg_state_val_in_pages(int idx, int val)
>>>>>> +static long memcg_state_val_in_pages(int idx, long val)
>>>>>> {
>>>>>> int unit = memcg_page_state_unit(idx);
>>>>>
>>>>> Sashiko AI made an interesting argument [1] that this could lead to
>>>>> incorrectly returning a very large positive number. Let me verify that.
>>>>>
>>>>> [1] https://sashiko.dev/#/patchset/cover.1774342371.git.zhengqi.arch%40bytedance.com
>>>>>
>>>>> Sashiko wrote:
>>>>>> Does this change inadvertently break the handling of negative byte-sized
>>>>>> updates?
>>>>>> Looking at the rest of the function:
>>>>>> if (!val || unit == PAGE_SIZE)
>>>>>> return val;
>>>>>> else
>>>>>> return max(val * unit / PAGE_SIZE, 1UL);
>>>>>
>>>>>> PAGE_SIZE is defined as an unsigned long.
>>>>>
>>>>> Right, it's defined as 1UL << PAGE_SHIFT.
>>>>>
>>>>>> When val is negative, such as during uncharging of byte-sized stats like
>>>>>> MEMCG_ZSWAP_B, the expression val * unit is a negative long.
>>>>>
>>>>> Right.
>>>>>
>>>>>> Dividing a signed long by an unsigned long causes the signed long to be
>>>>>> promoted to unsigned before division,
>>>>>
>>>>> Right.
>>>>>
>>>>>> resulting in a massive positive
>>>>>> number instead of a small negative one.
>>>>>
>>>>> Let's look at an example (assuming unit is 1).
>>>>>
>>>>> val = val * unit = -16384 (-16 KiB)
>>>>> val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
>>>>> max(0x3FFFFFFFFFFFFF, 1UL) = 0x3FFFFFFFFFF
>>>>>
>>>>> Yeah, that's a massive positive number.
>>>>>
>>>>> Hmm but how did it work when it was int?
>>>>>
>>>>> val = val * unit = -16384 (-16KiB)
>>>>> val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
>>>>> max(val * unit / PAGE_SIZE, 1UL) = 0x3FFFFFFFFFFFFF
>>>>> (int)0x3FFFFFFFFFFFFF = 0xFFFFFFFF = (-1)
>>>>>
>>>>> That's incorrect. It should have been -4?
>>>>>
>>>>>> Before this change, the function returned an int, which implicitly truncated
>>>>>> the massive unsigned 64-bit result to a 32-bit int, accidentally yielding the
>>>>>> correct negative arithmetic value.
>>>>>
>>>>> So... "accidentally yielding the correct negative arithemetic value"
>>>>> is wrong.
>>>>>
>>>>> Sounds like it's been subtly broken even before this patch and nobody
>>>>> noticed.
>>>>
>>>> Thank you for such a detailed analysis! And I think you are right.
>>>
>>> No problem ;)
>>>
>>>> The memcg_state_val_in_pages() is only to make @val to be in pages, so
>>>> perhaps we can avoid the above problem by taking the absolute value
>>>> first?
>>
>> For more clearly, here is the diff:
>>
>> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
>> index 6491ca74b3398..2b34805b01476 100644
>> --- a/mm/memcontrol.c
>> +++ b/mm/memcontrol.c
>> @@ -787,11 +787,17 @@ static int memcg_page_state_unit(int item);
>> static long memcg_state_val_in_pages(int idx, long val)
>> {
>> int unit = memcg_page_state_unit(idx);
>> + unsigned long uval;
>> + long res;
>>
>> if (!val || unit == PAGE_SIZE)
>> return val;
>> - else
>> - return max(val * unit / PAGE_SIZE, 1UL);
>> +
>> + uval = val < 0 ? -(unsigned long)val : (unsigned long)val;
>
> We could use abs() macro in linux/math.h here :)
>
> val should not be LONG_MIN, but it should be fine
> to assume it won't reach LONG_MIN.
OK, will use abs() macro.
>
>> +
>> + res = max(mult_frac(uval, unit, PAGE_SIZE), 1UL);
>> +
>> + return val < 0 ? -res : res;
>> }
>>
>> #ifdef CONFIG_MEMCG_V1
>>
>>> That would work for memcg_rstat_updated(),
>>> but not for trace_mod_memcg_state()?
>>
>> Why? The trace_mod_memcg_state() seems to accept 'long' type,
>> am I missing something?
>
> Nevermind. Without the diff, I misunderstood what you meant.
OK, will apply this diff and send the v2.
Thanks,
Qi
>
> Thanks!
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 3/3] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size()
2026-03-24 11:31 ` [PATCH 3/3] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size() Qi Zheng
2026-03-24 12:28 ` Lorenzo Stoakes (Oracle)
@ 2026-03-26 2:35 ` kernel test robot
2026-03-26 3:36 ` Andrew Morton
1 sibling, 1 reply; 23+ messages in thread
From: kernel test robot @ 2026-03-26 2:35 UTC (permalink / raw)
To: Qi Zheng, hannes, hughd, mhocko, roman.gushchin, shakeel.butt,
muchun.song, david, lorenzo.stoakes, ziy, harry.yoo, yosry.ahmed,
imran.f.khan, kamalesh.babulal, axelrasmussen, yuanchu, weixugc,
chenridong, mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe,
usamaarif642
Cc: oe-kbuild-all, linux-mm, linux-kernel, Qi Zheng
Hi Qi,
kernel test robot noticed the following build warnings:
[auto build test WARNING on akpm-mm/mm-everything]
[also build test WARNING on next-20260325]
[cannot apply to trace/for-next linus/master v7.0-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Qi-Zheng/mm-memcontrol-correct-the-type-of-stats_updates-to-unsigned-long/20260325-230337
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/r/2cf06f9faf51900ce6acbb4740fc60355a2842ed.1774342371.git.zhengqi.arch%40bytedance.com
patch subject: [PATCH 3/3] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size()
config: riscv-allnoconfig-bpf (https://download.01.org/0day-ci/archive/20260326/202603260338.GfCrsaVO-lkp@intel.com/config)
compiler: riscv64-linux-gnu-gcc (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260326/202603260338.GfCrsaVO-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603260338.GfCrsaVO-lkp@intel.com/
All warnings (new ones prefixed by >>):
In file included from ./arch/riscv/include/asm/bug.h:90,
from ./include/linux/bug.h:5,
from ./arch/riscv/include/asm/cmpxchg.h:9,
from ./arch/riscv/include/asm/barrier.h:14,
from ./include/linux/list.h:11,
from ./include/linux/cgroup-defs.h:12,
from mm/memcontrol.c:28:
mm/memcontrol.c: In function 'mem_cgroup_update_lru_size':
>> mm/memcontrol.c:1486:17: warning: format '%d' expects argument of type 'int', but argument 5 has type 'long int' [-Wformat=]
1486 | "%s(%p, %d, %d): lru_size %ld\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1487 | __func__, lruvec, lru, nr_pages, size)) {
| ~~~~~~~~
| |
| long int
./include/asm-generic/bug.h:133:31: note: in definition of macro '__WARN_printf'
133 | __warn_printk(arg); \
| ^~~
./include/linux/once_lite.h:31:25: note: in expansion of macro 'WARN'
31 | func(__VA_ARGS__); \
| ^~~~
./include/asm-generic/bug.h:185:9: note: in expansion of macro 'DO_ONCE_LITE_IF'
185 | DO_ONCE_LITE_IF(condition, WARN, 1, format)
| ^~~~~~~~~~~~~~~
mm/memcontrol.c:1485:13: note: in expansion of macro 'WARN_ONCE'
1485 | if (WARN_ONCE(size < 0,
| ^~~~~~~~~
mm/memcontrol.c:1486:30: note: format string is defined here
1486 | "%s(%p, %d, %d): lru_size %ld\n",
| ~^
| |
| int
| %ld
vim +1486 mm/memcontrol.c
6168d0da2b479ce Alex Shi 2020-12-15 1457
925b7673cce3911 Johannes Weiner 2012-01-12 1458 /**
fa9add641b1b1c5 Hugh Dickins 2012-05-29 1459 * mem_cgroup_update_lru_size - account for adding or removing an lru page
fa9add641b1b1c5 Hugh Dickins 2012-05-29 1460 * @lruvec: mem_cgroup per zone lru vector
fa9add641b1b1c5 Hugh Dickins 2012-05-29 1461 * @lru: index of lru list the page is sitting on
b4536f0c829c858 Michal Hocko 2017-01-10 1462 * @zid: zone id of the accounted pages
fa9add641b1b1c5 Hugh Dickins 2012-05-29 1463 * @nr_pages: positive when adding or negative when removing
925b7673cce3911 Johannes Weiner 2012-01-12 1464 *
ca707239e8a7958 Hugh Dickins 2016-05-19 1465 * This function must be called under lru_lock, just before a page is added
07ca760673088f2 Hugh Dickins 2022-02-14 1466 * to or just after a page is removed from an lru list.
925b7673cce3911 Johannes Weiner 2012-01-12 1467 */
fa9add641b1b1c5 Hugh Dickins 2012-05-29 1468 void mem_cgroup_update_lru_size(struct lruvec *lruvec, enum lru_list lru,
6a3cda9fd4d0f0b Qi Zheng 2026-03-24 1469 int zid, long nr_pages)
08e552c69c6930d KAMEZAWA Hiroyuki 2009-01-07 1470 {
ef8f2327996b5c2 Mel Gorman 2016-07-28 1471 struct mem_cgroup_per_node *mz;
fa9add641b1b1c5 Hugh Dickins 2012-05-29 1472 unsigned long *lru_size;
ca707239e8a7958 Hugh Dickins 2016-05-19 1473 long size;
08e552c69c6930d KAMEZAWA Hiroyuki 2009-01-07 1474
f8d665422603ee1 Hirokazu Takahashi 2009-01-07 1475 if (mem_cgroup_disabled())
08e552c69c6930d KAMEZAWA Hiroyuki 2009-01-07 1476 return;
6d12e2d8ddbe653 KAMEZAWA Hiroyuki 2008-02-07 1477
ef8f2327996b5c2 Mel Gorman 2016-07-28 1478 mz = container_of(lruvec, struct mem_cgroup_per_node, lruvec);
b4536f0c829c858 Michal Hocko 2017-01-10 1479 lru_size = &mz->lru_zone_size[zid][lru];
ca707239e8a7958 Hugh Dickins 2016-05-19 1480
ca707239e8a7958 Hugh Dickins 2016-05-19 1481 if (nr_pages < 0)
ca707239e8a7958 Hugh Dickins 2016-05-19 1482 *lru_size += nr_pages;
ca707239e8a7958 Hugh Dickins 2016-05-19 1483
ca707239e8a7958 Hugh Dickins 2016-05-19 1484 size = *lru_size;
b4536f0c829c858 Michal Hocko 2017-01-10 1485 if (WARN_ONCE(size < 0,
b4536f0c829c858 Michal Hocko 2017-01-10 @1486 "%s(%p, %d, %d): lru_size %ld\n",
b4536f0c829c858 Michal Hocko 2017-01-10 1487 __func__, lruvec, lru, nr_pages, size)) {
ca707239e8a7958 Hugh Dickins 2016-05-19 1488 VM_BUG_ON(1);
ca707239e8a7958 Hugh Dickins 2016-05-19 1489 *lru_size = 0;
ca707239e8a7958 Hugh Dickins 2016-05-19 1490 }
ca707239e8a7958 Hugh Dickins 2016-05-19 1491
ca707239e8a7958 Hugh Dickins 2016-05-19 1492 if (nr_pages > 0)
fa9add641b1b1c5 Hugh Dickins 2012-05-29 1493 *lru_size += nr_pages;
08e552c69c6930d KAMEZAWA Hiroyuki 2009-01-07 1494 }
544122e5e0ee27d KAMEZAWA Hiroyuki 2009-01-07 1495
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 3/3] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size()
2026-03-26 2:35 ` kernel test robot
@ 2026-03-26 3:36 ` Andrew Morton
0 siblings, 0 replies; 23+ messages in thread
From: Andrew Morton @ 2026-03-26 3:36 UTC (permalink / raw)
To: kernel test robot
Cc: Qi Zheng, hannes, hughd, mhocko, roman.gushchin, shakeel.butt,
muchun.song, david, lorenzo.stoakes, ziy, harry.yoo, yosry.ahmed,
imran.f.khan, kamalesh.babulal, axelrasmussen, yuanchu, weixugc,
chenridong, mkoutny, hamzamahfooz, apais, lance.yang, bhe,
usamaarif642, oe-kbuild-all, linux-mm, linux-kernel, Qi Zheng
On Thu, 26 Mar 2026 03:35:39 +0100 kernel test robot <lkp@intel.com> wrote:
> Hi Qi,
>
> kernel test robot noticed the following build warnings:
>
> [auto build test WARNING on akpm-mm/mm-everything]
> [also build test WARNING on next-20260325]
> [cannot apply to trace/for-next linus/master v7.0-rc5]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Qi-Zheng/mm-memcontrol-correct-the-type-of-stats_updates-to-unsigned-long/20260325-230337
> base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> patch link: https://lore.kernel.org/r/2cf06f9faf51900ce6acbb4740fc60355a2842ed.1774342371.git.zhengqi.arch%40bytedance.com
> patch subject: [PATCH 3/3] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size()
> config: riscv-allnoconfig-bpf (https://download.01.org/0day-ci/archive/20260326/202603260338.GfCrsaVO-lkp@intel.com/config)
> compiler: riscv64-linux-gnu-gcc (Debian 14.2.0-19) 14.2.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260326/202603260338.GfCrsaVO-lkp@intel.com/reproduce)
Thanks. Can't reproduce. (there are meds for this!)
> b4536f0c829c858 Michal Hocko 2017-01-10 @1486 "%s(%p, %d, %d): lru_size %ld\n",
We presently have
"%s(%p, %d, %ld): lru_size %ld\n",
so it appears we fixed this recently.
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state()
2026-03-25 1:43 ` Harry Yoo (Oracle)
2026-03-25 3:25 ` Qi Zheng
@ 2026-03-26 7:49 ` Harry Yoo (Oracle)
1 sibling, 0 replies; 23+ messages in thread
From: Harry Yoo (Oracle) @ 2026-03-26 7:49 UTC (permalink / raw)
To: Qi Zheng
Cc: hannes, hughd, mhocko, roman.gushchin, shakeel.butt, muchun.song,
david, lorenzo.stoakes, ziy, yosry.ahmed, imran.f.khan,
kamalesh.babulal, axelrasmussen, yuanchu, weixugc, chenridong,
mkoutny, akpm, hamzamahfooz, apais, lance.yang, bhe, usamaarif642,
linux-mm, linux-kernel, Qi Zheng
On Wed, Mar 25, 2026 at 10:43:58AM +0900, Harry Yoo (Oracle) wrote:
> On Tue, Mar 24, 2026 at 07:31:28PM +0800, Qi Zheng wrote:
> > @@ -784,7 +784,7 @@ static int memcg_page_state_unit(int item);
> > * Normalize the value passed into memcg_rstat_updated() to be in pages. Round
> > * up non-zero sub-page updates to 1 page as zero page updates are ignored.
> > */
> > -static int memcg_state_val_in_pages(int idx, int val)
> > +static long memcg_state_val_in_pages(int idx, long val)
> > {
> > int unit = memcg_page_state_unit(idx);
>
> Sashiko AI made an interesting argument [1] that this could lead to
> incorrectly returning a very large positive number. Let me verify that.
>
> [1] https://sashiko.dev/#/patchset/cover.1774342371.git.zhengqi.arch%40bytedance.com
>
> Sashiko wrote:
> > Does this change inadvertently break the handling of negative byte-sized
> > updates?
> > Looking at the rest of the function:
> > if (!val || unit == PAGE_SIZE)
> > return val;
> > else
> > return max(val * unit / PAGE_SIZE, 1UL);
>
> > PAGE_SIZE is defined as an unsigned long.
>
> Right, it's defined as 1UL << PAGE_SHIFT.
>
> > When val is negative, such as during uncharging of byte-sized stats like
> > MEMCG_ZSWAP_B, the expression val * unit is a negative long.
>
> Right.
>
> > Dividing a signed long by an unsigned long causes the signed long to be
> > promoted to unsigned before division,
>
> Right.
>
> > resulting in a massive positive
> > number instead of a small negative one.
>
> Let's look at an example (assuming unit is 1).
>
> val = val * unit = -16384 (-16 KiB)
> val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
> max(0x3FFFFFFFFFFFFF, 1UL) = 0x3FFFFFFFFFF
>
> Yeah, that's a massive positive number.
>
> Hmm but how did it work when it was int?
Oops, I was about to say... "Oh, doesn't patch 4/4 in v2 need to have
Fixes: 7bd5bc3ce963 ("mm: memcg: normalize the value passed into memcg_rstat_updated()")
???"
but then I realized that I made a silly mistake here.
> val = val * unit = -16384 (-16KiB)
> val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / PAGE_SIZE = 0x3FFFFFFFFFFFFF
Err, I should have divided it by 0x1000, not 0x4096.
val * unit / PAGE_SIZE = 0xFFFFFFFFFFFFC000 / 0x1000 = 0xFFFFFFFFFFFFC
max(val * unit / PAGE_SIZE, 1UL) = 0xFFFFFFFFFFFFC
(int)0xFFFFFFFFFFFFC = -4.
> max(val * unit / PAGE_SIZE, 1UL) = 0x3FFFFFFFFFFFFF
> (int)0x3FFFFFFFFFFFFF = 0xFFFFFFFF = (-1)
>
> That's incorrect. It should have been -4?
So that was correct.
The existing logic produces an accurate number (intended or not) as it
is right-shifted to only PAGE_SHIFT bits and truncated to int.
The existing logic is fine, it'll only be a problem when it's not
truncated to int.
> > Before this change, the function returned an int, which implicitly truncated
> > the massive unsigned 64-bit result to a 32-bit int, accidentally yielding the
> > correct negative arithmetic value.
>
> So... "accidentally yielding the correct negative arithemetic value"
> is wrong.
I was wrong, not sashiko!
> Sounds like it's been subtly broken even before this patch and nobody
> noticed.
No, it's not.
--
Cheers,
Harry / Hyeonggon
^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2026-03-26 7:49 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-24 11:31 [PATCH 0/3] correct the parameter type of some mm functions Qi Zheng
2026-03-24 11:31 ` [PATCH] fix: mm: memcontrol: convert objcg to be per-memcg per-node type Qi Zheng
2026-03-24 11:34 ` Qi Zheng
2026-03-24 11:31 ` [PATCH 1/3] mm: memcontrol: correct the type of stats_updates to unsigned long Qi Zheng
2026-03-24 12:20 ` Lorenzo Stoakes (Oracle)
2026-03-24 11:31 ` [PATCH 2/3] mm: memcontrol: correct the parameter type of __mod_memcg{_lruvec}_state() Qi Zheng
2026-03-24 12:21 ` Lorenzo Stoakes (Oracle)
2026-03-24 14:12 ` Matthew Wilcox
2026-03-24 14:24 ` Lorenzo Stoakes (Oracle)
2026-03-25 1:43 ` Harry Yoo (Oracle)
2026-03-25 3:25 ` Qi Zheng
2026-03-25 5:17 ` Harry Yoo (Oracle)
2026-03-25 7:26 ` Qi Zheng
2026-03-25 7:36 ` Harry Yoo (Oracle)
2026-03-25 7:39 ` Qi Zheng
2026-03-26 7:49 ` Harry Yoo (Oracle)
2026-03-24 11:31 ` [PATCH 3/3] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size() Qi Zheng
2026-03-24 12:28 ` Lorenzo Stoakes (Oracle)
2026-03-25 0:27 ` Harry Yoo (Oracle)
2026-03-25 3:34 ` Qi Zheng
2026-03-26 2:35 ` kernel test robot
2026-03-26 3:36 ` Andrew Morton
2026-03-24 11:57 ` [PATCH 0/3] correct the parameter type of some mm functions Lorenzo Stoakes (Oracle)
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.