From: Qi Zheng <qi.zheng@linux.dev>
To: "Lorenzo Stoakes (Oracle)" <ljs@kernel.org>, akpm@linux-foundation.org
Cc: hannes@cmpxchg.org, hughd@google.com, mhocko@suse.com,
roman.gushchin@linux.dev, shakeel.butt@linux.dev,
muchun.song@linux.dev, david@kernel.org, ziy@nvidia.com,
harry.yoo@oracle.com, yosry.ahmed@linux.dev,
imran.f.khan@oracle.com, kamalesh.babulal@oracle.com,
axelrasmussen@google.com, yuanchu@google.com, weixugc@google.com,
chenridong@huaweicloud.com, mkoutny@suse.com,
hamzamahfooz@linux.microsoft.com, apais@linux.microsoft.com,
lance.yang@linux.dev, bhe@redhat.com, usamaarif642@gmail.com,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
"Harry Yoo (Oracle)" <harry@kernel.org>,
Qi Zheng <zhengqi.arch@bytedance.com>
Subject: Re: [PATCH v2 4/4] mm: memcontrol: fix unexpected massive positive number in memcg_state_val_in_pages()
Date: Thu, 26 Mar 2026 17:32:05 +0800 [thread overview]
Message-ID: <b6462703-9744-409e-a770-b9a7ca5fa198@linux.dev> (raw)
In-Reply-To: <54c2b09c-84f8-4118-96a6-acc13ca2f245@lucifer.local>
On 3/26/26 5:16 PM, Lorenzo Stoakes (Oracle) wrote:
> On Wed, Mar 25, 2026 at 10:13:25PM +0800, Qi Zheng wrote:
>> From: Qi Zheng <zhengqi.arch@bytedance.com>
>>
>> In memcg_state_val_in_pages(), if the passed val is negative, the
>> expression val * unit / PAGE_SIZE could be implicitly converted to a
>> massive positive number when compared with 1UL in the max() macro.
>> This leads to returning an incorrect massive positive value.
>>
>> Fix this by using abs(val) to calculate the magnitude first, and then
>> restoring the sign of the value before returning the result. Additionally,
>> use mult_frac() to prevent potential overflow during the multiplication of
>> val and unit.
>>
>> Reported-by: Harry Yoo (Oracle) <harry@kernel.org>
>> Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
>
> The logic is correct, but I think this needs rework for better
> understanding, and obviously this should be squashed into 2/4 as per
> Andrew.
>
> With the below change applied:
>
> Reviewed-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org>
>
>> ---
>> mm/memcontrol.c | 7 +++++--
>> 1 file changed, 5 insertions(+), 2 deletions(-)
>>
>> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
>> index 04076a139dbe3..0c249255ebefb 100644
>> --- a/mm/memcontrol.c
>> +++ b/mm/memcontrol.c
>> @@ -787,11 +787,14 @@ 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);
>> + long res;
>>
>> if (!val || unit == PAGE_SIZE)
>> return val;
>> - else
>> - return max(val * unit / PAGE_SIZE, 1UL);
>
> Hm this was already fairly horrid, because we're comparing an unsigned long
> value of 1 vs. a ULONG_MAX - abs(val) so this was intended to make 0 -> 1UL
> but not what you'd mathematically think this was which was to make negative
> values (logically < 1) -> 1.
>
> Of course before it was just broken and would promote (val * unit /
> PAGE_SIZE) to unsigned long first (thus massive number) and return that :)
>
>> +
>> + res = max(mult_frac(abs(val), unit, PAGE_SIZE), 1UL);
>
> This is way too compressed into one line and retains the confusing
> behaviour.
>
> Could we split this out and explain what we're doing (sign-extension,
> integer promotion and all of this stuff is confusing - so let's just accept
> that and spell it out):
>
> /* Get the absolute value of (val * unit / PAGE_SIZE). */
> res = mult_frac(abs(val), unit, PAGE_SIZE);
> /* Round up zero values. */
> res = res ?: 1;
> /* Retain sign. */
> return val < 0 ? -res : res;
>
> This is functionally identical, but a lot more readable, I think.
Make sense, I will update to v3.
If Andrew needs me to merge this patchset into "[PATCH v6 00/33]
Eliminate Dying Memory Cgroup" [1], then I will develop and send v7.
[1].
https://lore.kernel.org/all/cover.1772711148.git.zhengqi.arch@bytedance.com/
Thanks,
Qi
>
>> +
>> + return val < 0 ? -res : res;
>> }
>>
>> #ifdef CONFIG_MEMCG_V1
>> --
>> 2.20.1
>>
>
> Cheers, Lorenzo
next prev parent reply other threads:[~2026-03-26 9:32 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-25 14:13 [PATCH v2 0/4] fix unexpected type conversions and potential overflows Qi Zheng
2026-03-25 14:13 ` [PATCH v2 1/4] mm: memcontrol: correct the type of stats_updates to unsigned long Qi Zheng
2026-03-25 15:28 ` Lorenzo Stoakes (Oracle)
2026-03-26 2:32 ` Qi Zheng
2026-03-26 8:05 ` Lorenzo Stoakes (Oracle)
2026-03-26 8:19 ` Harry Yoo (Oracle)
2026-03-26 8:20 ` Qi Zheng
2026-03-25 14:13 ` [PATCH v2 2/4] mm: memcontrol: change val type to long in __mod_memcg_{lruvec_}state() Qi Zheng
2026-03-26 9:19 ` Lorenzo Stoakes (Oracle)
2026-03-26 14:37 ` David Laight
2026-03-27 2:37 ` Qi Zheng
2026-03-25 14:13 ` [PATCH v2 3/4] mm: memcontrol: correct the nr_pages parameter type of mem_cgroup_update_lru_size() Qi Zheng
2026-03-25 14:13 ` [PATCH v2 4/4] mm: memcontrol: fix unexpected massive positive number in memcg_state_val_in_pages() Qi Zheng
2026-03-26 9:16 ` Lorenzo Stoakes (Oracle)
2026-03-26 9:21 ` Lorenzo Stoakes (Oracle)
2026-03-26 9:32 ` Qi Zheng [this message]
2026-03-26 9:38 ` Lorenzo Stoakes (Oracle)
2026-03-27 0:06 ` Andrew Morton
2026-03-27 2:42 ` Qi Zheng
2026-03-27 3:13 ` Andrew Morton
2026-03-27 7:51 ` Lorenzo Stoakes (Oracle)
2026-03-25 14:24 ` [PATCH v2 0/4] fix unexpected type conversions and potential overflows Qi Zheng
2026-03-25 23:57 ` Andrew Morton
2026-03-26 0:28 ` Andrew Morton
2026-03-26 2:30 ` Qi Zheng
2026-03-26 3:27 ` Andrew Morton
2026-03-26 7:14 ` Michal Hocko
2026-03-26 7:51 ` Harry Yoo (Oracle)
2026-03-26 8:18 ` Michal Hocko
2026-03-26 9:22 ` Lorenzo Stoakes (Oracle)
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=b6462703-9744-409e-a770-b9a7ca5fa198@linux.dev \
--to=qi.zheng@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=apais@linux.microsoft.com \
--cc=axelrasmussen@google.com \
--cc=bhe@redhat.com \
--cc=chenridong@huaweicloud.com \
--cc=david@kernel.org \
--cc=hamzamahfooz@linux.microsoft.com \
--cc=hannes@cmpxchg.org \
--cc=harry.yoo@oracle.com \
--cc=harry@kernel.org \
--cc=hughd@google.com \
--cc=imran.f.khan@oracle.com \
--cc=kamalesh.babulal@oracle.com \
--cc=lance.yang@linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=mhocko@suse.com \
--cc=mkoutny@suse.com \
--cc=muchun.song@linux.dev \
--cc=roman.gushchin@linux.dev \
--cc=shakeel.butt@linux.dev \
--cc=usamaarif642@gmail.com \
--cc=weixugc@google.com \
--cc=yosry.ahmed@linux.dev \
--cc=yuanchu@google.com \
--cc=zhengqi.arch@bytedance.com \
--cc=ziy@nvidia.com \
/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.