From: Chunyu Hu <chuhu@redhat.com>
To: David Hildenbrand <david@redhat.com>
Cc: akpm@linux-foundation.org, shuah@kernel.org, linux-mm@kvack.org,
linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org,
lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com,
vbabka@suse.cz, rppt@kernel.org, surenb@google.com,
mhocko@suse.com
Subject: Re: [PATCH v2 3/3] selftests/mm: fix va_high_addr_switch.sh failure on x86_64
Date: Tue, 9 Sep 2025 14:28:31 +0800 [thread overview]
Message-ID: <aL_JD_vNvM2kXoRJ@gmail.com> (raw)
In-Reply-To: <22a9dd3e-0755-4f7f-a59c-a79a52871f56@redhat.com>
On Mon, Sep 08, 2025 at 03:09:24PM +0200, David Hildenbrand wrote:
> On 08.09.25 14:47, Chunyu Hu wrote:
> > The test will fail as below on x86_64 with cpu la57 support (will skip if
> > no la57 support). Note, the test requries nr_hugepages to be set first.
> >
> > # running bash ./va_high_addr_switch.sh
> > # -------------------------------------
> > # mmap(addr_switch_hint - pagesize, pagesize): 0x7f55b60fa000 - OK
> > # mmap(addr_switch_hint - pagesize, (2 * pagesize)): 0x7f55b60f9000 - OK
> > # mmap(addr_switch_hint, pagesize): 0x800000000000 - OK
> > # mmap(addr_switch_hint, 2 * pagesize, MAP_FIXED): 0x800000000000 - OK
> > # mmap(NULL): 0x7f55b60f9000 - OK
> > # mmap(low_addr): 0x40000000 - OK
> > # mmap(high_addr): 0x1000000000000 - OK
> > # mmap(high_addr) again: 0xffff55b6136000 - OK
> > # mmap(high_addr, MAP_FIXED): 0x1000000000000 - OK
> > # mmap(-1): 0xffff55b6134000 - OK
> > # mmap(-1) again: 0xffff55b6132000 - OK
> > # mmap(addr_switch_hint - pagesize, pagesize): 0x7f55b60fa000 - OK
> > # mmap(addr_switch_hint - pagesize, 2 * pagesize): 0x7f55b60f9000 - OK
> > # mmap(addr_switch_hint - pagesize/2 , 2 * pagesize): 0x7f55b60f7000 - OK
> > # mmap(addr_switch_hint, pagesize): 0x800000000000 - OK
> > # mmap(addr_switch_hint, 2 * pagesize, MAP_FIXED): 0x800000000000 - OK
> > # mmap(NULL, MAP_HUGETLB): 0x7f55b5c00000 - OK
> > # mmap(low_addr, MAP_HUGETLB): 0x40000000 - OK
> > # mmap(high_addr, MAP_HUGETLB): 0x1000000000000 - OK
> > # mmap(high_addr, MAP_HUGETLB) again: 0xffff55b5e00000 - OK
> > # mmap(high_addr, MAP_FIXED | MAP_HUGETLB): 0x1000000000000 - OK
> > # mmap(-1, MAP_HUGETLB): 0x7f55b5c00000 - OK
> > # mmap(-1, MAP_HUGETLB) again: 0x7f55b5a00000 - OK
> > # mmap(addr_switch_hint - pagesize, 2*hugepagesize, MAP_HUGETLB): 0x800000000000 - FAILED
> > # mmap(addr_switch_hint , 2*hugepagesize, MAP_FIXED | MAP_HUGETLB): 0x800000000000 - OK
> > # [FAIL]
> >
> > addr_switch_hint is defined as DFEFAULT_MAP_WINDOW in the failed test (for
> > x86_64, DFEFAULT_MAP_WINDOW is defined as (1UL<<47) - pagesize) in 64 bit.
> >
> > Before commit cc92882ee218 ("mm: drop hugetlb_get_unmapped_area{_*}
> > functions"), for x86_64 hugetlb_get_unmapped_area() is handled in arch code
> > arch/x86/mm/hugetlbpage.c and addr is checked with map_address_hint_valid()
> > after align with 'addr &= huge_page_mask(h)' which is a round down way, and
> > it will fail the check because the addr is within the DEFAULT_MAP_WINDOW but
> > (addr + len) is above the DFEFAULT_MAP_WINDOW. So it wil go through the
> > hugetlb_get_unmmaped_area_top_down() to find an area within the
> > DFEFAULT_MAP_WINDOW.
> >
> > After commit cc92882ee218 ("mm: drop hugetlb_get_unmapped_area{_*}
> > functions"). The addr hint for hugetlb_get_unmmaped_area() will be rounded
> > up and aligned to hugepage size with ALIGN() for all arches. And after the
> > align, the addr will be above the default MAP_DEFAULT_WINDOW, and the
> > map_addresshint_valid() check will pass because both aligned addr (addr0)
> > and (addr + len) are above the DEFAULT_MAP_WINDOW, and the aligned hint
> > address (0x800000000000) is returned as an suitable gap is found there,
> > in arch_get_unmapped_area_topdown().
> >
> > To still cover the case that addr is within the DEFAULT_MAP_WINDOW, and
> > addr + len is above the DFEFAULT_MAP_WINDOW, make the addr hint one
> > hugepage lower, so that after the align it's still within DEFAULT_MAP_WINDOW,
> > and the addr + len (2 hugepages) will be above DEFAULT_MAP_WINDOW.
> >
> > Fixes: cc92882ee218 ("mm: drop hugetlb_get_unmapped_area{_*} functions")
> > Signed-off-by: Chunyu Hu <chuhu@redhat.com>
> > ---
> > tools/testing/selftests/mm/va_high_addr_switch.c | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/tools/testing/selftests/mm/va_high_addr_switch.c b/tools/testing/selftests/mm/va_high_addr_switch.c
> > index 896b3f73fc53..bd96dc3b5931 100644
> > --- a/tools/testing/selftests/mm/va_high_addr_switch.c
> > +++ b/tools/testing/selftests/mm/va_high_addr_switch.c
> > @@ -230,10 +230,10 @@ void testcases_init(void)
> > .msg = "mmap(-1, MAP_HUGETLB) again",
> > },
> > {
> > - .addr = (void *)(addr_switch_hint - pagesize),
> > + .addr = (void *)(addr_switch_hint - pagesize - hugepagesize),
>
> Wouldn't it be more deterministic to do the alignment/rounding ourselves?
>
> (void *)(ALIGN_DOWN(addr_switch_hint - pagesize), hugepagesize)
>
> Unfortunately we don't have an ALIGN_DOWN helper available yet.
>
> We could just move the one in pkey-helpers.h into vm_util.h
Thanks for the review!
This is good idea and it would be more deterministic if we provide an
aligned address directly, then the kernel change won't affect the test.
>
>
> But now I realize that, likely,
>
> .addr = (void *)(addr_switch_hint - hugepagesize),
>
> would just work and be aligned?
Yes, it's aligned to the hugepagesize, align down and works. I prefer
this way as it's easier and all other tests in the file do like this.
Thanks for the suggestion.
I thought we would lose some test coverage on testing if it will work when
an un-hugepagesize aligned addr is provided. Do you think it's
necessary? If not, I'll change to:
.addr = (void *)(addr_switch_hint - hugepagesize),
or we can add them both if necesasry.
>
> --
> Cheers
>
> David / dhildenb
>
next prev parent reply other threads:[~2025-09-09 6:28 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-08 12:47 [PATCH v2 0/3] Fix va_high_addr_switch.sh test failure Chunyu Hu
2025-09-08 12:47 ` [PATCH v2 1/3] selftests/mm: fix hugepages cleanup too early Chunyu Hu
2025-09-08 12:47 ` [PATCH v2 2/3] selftests/mm: alloc hugepages in va_high_addr_switch test Chunyu Hu
2025-09-08 12:47 ` [PATCH v2 3/3] selftests/mm: fix va_high_addr_switch.sh failure on x86_64 Chunyu Hu
2025-09-08 13:09 ` David Hildenbrand
2025-09-09 6:28 ` Chunyu Hu [this message]
2025-09-08 12:53 ` [PATCH v2 1/3] selftests/mm: fix hugepages cleanup too early David Hildenbrand
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=aL_JD_vNvM2kXoRJ@gmail.com \
--to=chuhu@redhat.com \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=david@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=mhocko@suse.com \
--cc=rppt@kernel.org \
--cc=shuah@kernel.org \
--cc=surenb@google.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 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.