All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ankur Arora <ankur.a.arora@oracle.com>
To: Matthew Wilcox <willy@infradead.org>
Cc: Dev Jain <dev.jain@arm.com>, Li Zhe <lizhe.67@bytedance.com>,
	akpm@linux-foundation.org, david@kernel.org,
	lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com,
	vbabka@suse.cz, rppt@kernel.org, surenb@google.com,
	mhocko@suse.com, ankur.a.arora@oracle.com, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] mm: Avoid calling folio_page() with an out-of-bounds index
Date: Wed, 25 Feb 2026 22:52:19 -0800	[thread overview]
Message-ID: <87fr6oxaho.fsf@oracle.com> (raw)
In-Reply-To: <aZ75ydx-FKaFvygT@casper.infradead.org>


Matthew Wilcox <willy@infradead.org> writes:

> On Wed, Feb 25, 2026 at 03:35:32PM +0530, Dev Jain wrote:
>> On 25/02/26 2:56 pm, Li Zhe wrote:
>> > In folio_zero_user(), the page pointer is calculated via folio_page()
>> > before checking if the number of pages to be cleared is greater than zero.
>> > Furthermore, folio_page() does not verify that the page number lies
>> > within folio.
>> >
>> > When 'addr_hint' is near the end of a large folio, the range 'r[0]'
>> > represents an empty interval. In this scenario, 'nr_pages' will be
>> > calculated as 0 and 'r[0].start' can be an index that is out-of-bounds
>> > for folio_page(). The code unconditionally calls folio_page() on a wrong
>> > index, even though the subsequent clearing logic is correctly skipped.
>> >
>> > While this does not cause a functional bug today, calculating a page
>> > pointer for an out-of-bounds index is logically unsound and fragile. It
>> > could pose a risk for future refactoring or trigger warnings from static
>> > analysis tools.
>> >
>> > To fix this, move the call to folio_page() inside the 'if (nr_pages > 0)'
>> > block. This ensures that the page pointer is only calculated when it is
>> > actually needed for a valid, non-empty range of pages, thus making the code
>> > more robust and logically correct.
>> >
>> > Signed-off-by: Li Zhe <lizhe.67@bytedance.com>
>> > ---
>>
>> Not only the correctness, but even from a perf PoV (folio_zero_user is a
>> hot path) it may make sense to initialize the variable only when required.
>
> But now calculating 'addr' and 'page' is dependent on calculating
> nr_pages instead of being an independent calculation.  I'd be *VERY*

And the "nr_pages > 0" branch is determined by user space (in the
page fault case) so we likely will get a branch-miss there.

> wary of saying this is a performance win without actually measuring it.
> CPUs are far more complex than you seem to realise (which is ironic,
> given your employer).
>
> Now, maybe the compiler is smart enough to realise there isn't a real
> dependency and it can hoist the calculation out of the 'if'.  But then
> what have we achieved with this patch?
>
> Honestly, I think this patch is worthless and would not include it.
>
>>
>>
>> >  mm/memory.c | 8 +++++---
>> >  1 file changed, 5 insertions(+), 3 deletions(-)
>> >
>> > diff --git a/mm/memory.c b/mm/memory.c
>> > index 07778814b4a8..6f8c55d604b5 100644
>> > --- a/mm/memory.c
>> > +++ b/mm/memory.c
>> > @@ -7343,12 +7343,14 @@ void folio_zero_user(struct folio *folio, unsigned long addr_hint)
>> >  	r[0] = DEFINE_RANGE(r[2].end + 1, pg.end);
>> >
>> >  	for (i = 0; i < ARRAY_SIZE(r); i++) {
>> > -		const unsigned long addr = base_addr + r[i].start * PAGE_SIZE;
>> >  		const long nr_pages = (long)range_len(&r[i]);
>> > -		struct page *page = folio_page(folio, r[i].start);
>> >
>> > -		if (nr_pages > 0)
>> > +		if (nr_pages > 0) {
>> > +			const unsigned long addr = base_addr + r[i].start * PAGE_SIZE;
>> > +			struct page *page = folio_page(folio, r[i].start);
>> > +
>> >  			clear_contig_highpages(page, addr, nr_pages);
>> > +		}
>> >  	}
>> >  }
>> >
>>
>>


--
ankur


  parent reply	other threads:[~2026-02-26  6:53 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-25  9:26 [PATCH] mm: Avoid calling folio_page() with an out-of-bounds index Li Zhe
2026-02-25 10:05 ` Dev Jain
2026-02-25 13:31   ` Matthew Wilcox
2026-02-25 15:48     ` Dev Jain
2026-02-26  6:52     ` Ankur Arora [this message]
2026-02-25 13:40 ` David Hildenbrand (Arm)
2026-02-26  3:14   ` Li Zhe

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=87fr6oxaho.fsf@oracle.com \
    --to=ankur.a.arora@oracle.com \
    --cc=Liam.Howlett@oracle.com \
    --cc=akpm@linux-foundation.org \
    --cc=david@kernel.org \
    --cc=dev.jain@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=lizhe.67@bytedance.com \
    --cc=lorenzo.stoakes@oracle.com \
    --cc=mhocko@suse.com \
    --cc=rppt@kernel.org \
    --cc=surenb@google.com \
    --cc=vbabka@suse.cz \
    --cc=willy@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.