Re: [PATCH v4 1/3] mm: pagewalk: simplify hugepage boundary

From: David Hildenbrand (Red Hat)
Date: Thu Dec 25 2025 - 04:33:01 EST


On 12/24/25 19:06, Matthew Wilcox wrote:
On Wed, Dec 24, 2025 at 02:08:29PM +0000, David Laight wrote:
+++ b/mm/pagewalk.c
@@ -312,8 +312,7 @@ static int walk_pgd_range(unsigned long addr, unsigned long end,
static unsigned long hugetlb_entry_end(struct hstate *h, unsigned long addr,
unsigned long end)
{
- unsigned long boundary = (addr & huge_page_mask(h)) + huge_page_size(h);
- return boundary < end ? boundary : end;
+ return min(ALIGN(addr, huge_page_size(h)), end);
}

Please drop this patch from the mm-new branch, as it causes
'run_vmtests.sh' to hang. Specifically, it leads to the system hanging
when executing hugepage-vmemmap test, because the program falls into an
infinite loop in walk_hugetlb_range() and cannot break out.

Good catch! The problem is that ALIGN() returns addr itself when already
aligned, causing the infinite loop ...

Using ALIGN(addr + 1, huge_page_size(h)) would work.
Although it could be (addr + 1) & ~huge_page_mask(h) which is probably
the easiest to understand.
Some of the 'helper' macros don't really make the code easier to read.
(And that includes a lot of uses of min().)

Or we could go back to my original suggestion.

https://lore.kernel.org/linux-mm/aRyOWrARRlUCeEz6@xxxxxxxxxxxxxxxxxxxx/

which was in v2:

https://lore.kernel.org/linux-mm/f802959f58865371ba1b10081bced98e3784c5e4.1763796152.git.chandna.sahil@xxxxxxxxx/

I'm starting to wonder whether we should just leave that code alone :)

--
Cheers

David