From: Zi Yan <ziy@nvidia.com>
To: Wei Yang <richard.weiyang@gmail.com>
Cc: akpm@linux-foundation.org, linux-mm@kvack.org,
Johannes Weiner <hannes@cmpxchg.org>,
Vlastimil Babka <vbabka@suse.cz>,
David Hildenbrand <david@redhat.com>
Subject: Re: [PATCH] mm/page_alloc: find_large_buddy() from start_pfn aligned order
Date: Thu, 28 Aug 2025 23:02:33 -0400 [thread overview]
Message-ID: <489045AD-70D6-4167-843D-50A8DD19870B@nvidia.com> (raw)
In-Reply-To: <20250828091618.7869-1-richard.weiyang@gmail.com>
On 28 Aug 2025, at 5:16, Wei Yang wrote:
> We iterate pfn from order 0 to MAX_PAGE_ORDER aligned to find large
> buddy. While if the order is less than start_pfn aligned order, we would
> get the same pfn and do the same check again.
>
> Iterate from start_pfn aligned order to reduce duplicated work.
>
> Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
> Cc: Johannes Weiner <hannes@cmpxchg.org>
> Cc: Zi Yan <ziy@nvidia.com>
> Cc: Vlastimil Babka <vbabka@suse.cz>
> Cc: David Hildenbrand <david@redhat.com>
>
> ---
> I build this and run, but not sure how fully test this.
> ---
> mm/page_alloc.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 27ea4c7acd15..7f2dfd30106f 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -2033,7 +2033,7 @@ static int move_freepages_block(struct zone *zone, struct page *page,
> /* Look for a buddy that straddles start_pfn */
> static unsigned long find_large_buddy(unsigned long start_pfn)
> {
> - int order = 0;
> + int order = start_pfn ? __ffs(start_pfn) : MAX_PAGE_ORDER;
> struct page *page;
> unsigned long pfn = start_pfn;
I think it is right, but the code is very subtle and hard to understand
after the change. It is better to add comment to explain it.
Paste the code below for more context:
while (!PageBuddy(page = pfn_to_page(pfn))) {
/* Nothing found */
if (++order > MAX_PAGE_ORDER)
return start_pfn;
pfn &= ~0UL << order;
}
The code tries to find a PageBuddy starting from start_pfn starting from
order=0. When entering the while loop, it means PageBuddy cannot be order-0
and ++order increases the order by 1. Your change fast forwards the process
based on start_pfn. If start_pfn is not an order-0 page, based on first
set bit in start_pfn and how buddy page is chosen, the next possible PageBuddy
order can only be __ffs(start_pfn) + 1. Your code starts order at __ffs(start_pfn)
and it works because "if (++order > MAX_PAGE_ORDER)" increases order
to __ffs(start_pfn) + 1.
Can you add a comment on your "int order = ..."? Something like:
If start_pfn is not an order-0 PageBuddy, next PageBuddy containing start_pfn
has minimal order of __ffs(start_pfn) + 1. Fastforward order to __ffs(start_pfn)
to remove unnecessary work in the while below.
Feel free to reword the above.
With the added comment, feel free to add Reviewed-by: Zi Yan <ziy@nvidia.com>
BTW, I also notice that when start_pfn is an order-0 PageBuddy, the
"if (pfn + (1 << buddy_order(page)) > start_pfn)" check below would be true
even if there is no buddy straddles start_pfn, although "return pfn"
gives the same results as "return start_pfn" (no straddle). The original
code before the addition of find_large_buddy() (commit fd919a85cd55 ("mm:
page_isolation: prepare for hygienic freelists")) checks start_pfn == pfn
before the straddle check, so the correct code should check start_pfn == pfn
and return early. But since current code is functionally equivalent.
Maybe adding a comment about it would be sufficient. Something like:
When the found buddy order is 0, the check would give false positive,
but the returned result is still correct, since pfn is the same as start_pfn.
--
Best Regards,
Yan, Zi
next prev parent reply other threads:[~2025-08-29 3:02 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-28 9:16 Wei Yang
2025-08-29 3:02 ` Zi Yan [this message]
2025-08-30 1:25 ` Wei Yang
2025-08-30 3:20 ` Vishal Moola (Oracle)
2025-08-30 7:48 ` Wei Yang
2025-08-31 1:28 ` Zi Yan
2025-08-31 3:35 ` Wei Yang
2025-08-30 2:15 ` Wei Yang
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=489045AD-70D6-4167-843D-50A8DD19870B@nvidia.com \
--to=ziy@nvidia.com \
--cc=akpm@linux-foundation.org \
--cc=david@redhat.com \
--cc=hannes@cmpxchg.org \
--cc=linux-mm@kvack.org \
--cc=richard.weiyang@gmail.com \
--cc=vbabka@suse.cz \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox