<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p><br>
</p>
<div class="moz-cite-prefix">On 01/04/26 19:48, David Hildenbrand
(Arm) wrote:<br>
</div>
<blockquote type="cite"
cite="mid:142f8c68-43c7-4a6a-bd2c-1c5ebda09b27@kernel.org">
<pre wrap="" class="moz-quote-pre">On 3/27/26 08:16, Sayali Patil wrote:
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">Previously, register_region_with_uffd() created a new anonymous
mapping and overwrote the address supplied by the caller before
registering the range with userfaultfd.
As a result, userfaultfd was applied to an unrelated anonymous mapping
instead of the hugetlb region used by the test.
Remove the extra mmap() and register the caller-provided address range
directly using UFFDIO_REGISTER_MODE_MISSING, so that faults are
generated for the hugetlb mapping used by the test.
This ensures userfaultfd operates on the actual hugetlb test region and
validates the expected fault handling.
Before patch:
running ./hugepage-mremap
-------------------------
TAP version 13
1..1
Map haddr: Returned address is 0x7eaa40000000
Map daddr: Returned address is 0x7daa40000000
Map vaddr: Returned address is 0x7faa40000000
Address returned by mmap() = 0x7fff9d000000
Mremap: Returned address is 0x7faa40000000
First hex is 0
First hex is 3020100
ok 1 Read same data
Totals: pass:1 fail:0 xfail:0 xpass:0 skip:0 error:0
[PASS]
ok 1 hugepage-mremap
After patch:
running ./hugepage-mremap
-------------------------
TAP version 13
1..1
Map haddr: Returned address is 0x7eaa40000000
Map daddr: Returned address is 0x7daa40000000
Map vaddr: Returned address is 0x7faa40000000
Registered memory at address 0x7eaa40000000 with userfaultfd
Mremap: Returned address is 0x7faa40000000
First hex is 0
First hex is 3020100
ok 1 Read same data
Totals: pass:1 fail:0 xfail:0 xpass:0 skip:0 error:0
[PASS]
ok 1 hugepage-mremap
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Okay, so we tested mremap() of something that is not even hugetlb.
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">
Fixes: 12b613206474 ("mm, hugepages: add hugetlb vma mremap() test")
Tested-by: Venkat Rao Bagalkote <a class="moz-txt-link-rfc2396E" href="mailto:venkat88@linux.ibm.com"><venkat88@linux.ibm.com></a>
Signed-off-by: Sayali Patil <a class="moz-txt-link-rfc2396E" href="mailto:sayalip@linux.ibm.com"><sayalip@linux.ibm.com></a>
---
tools/testing/selftests/mm/hugepage-mremap.c | 21 +++++---------------
1 file changed, 5 insertions(+), 16 deletions(-)
diff --git a/tools/testing/selftests/mm/hugepage-mremap.c b/tools/testing/selftests/mm/hugepage-mremap.c
index b8f7d92e5a35..e611249080d6 100644
--- a/tools/testing/selftests/mm/hugepage-mremap.c
+++ b/tools/testing/selftests/mm/hugepage-mremap.c
@@ -85,25 +85,14 @@ static void register_region_with_uffd(char *addr, size_t len)
if (ioctl(uffd, UFFDIO_API, &uffdio_api) == -1)
ksft_exit_fail_msg("ioctl-UFFDIO_API: %s\n", strerror(errno));
- /* Create a private anonymous mapping. The memory will be
- * demand-zero paged--that is, not yet allocated. When we
- * actually touch the memory, it will be allocated via
- * the userfaultfd.
- */
-
- addr = mmap(NULL, len, PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
- if (addr == MAP_FAILED)
- ksft_exit_fail_msg("mmap: %s\n", strerror(errno));
-
- ksft_print_msg("Address returned by mmap() = %p\n", addr);
-
- /* Register the memory range of the mapping we just created for
- * handling by the userfaultfd object. In mode, we request to track
- * missing pages (i.e., pages that have not yet been faulted in).
+ /* Register the passed memory range for handling by the userfaultfd object.
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
/*
* ...
While at it.
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">+ * In mode, we request to track missing pages
+ * (i.e., pages that have not yet been faulted in).
*/
if (uffd_register(uffd, addr, len, true, false, false))
ksft_exit_fail_msg("ioctl-UFFDIO_REGISTER: %s\n", strerror(errno));
+
+ ksft_print_msg("Registered memory at address %p with userfaultfd\n", addr);
}
int main(int argc, char *argv[])
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Yes, that code is extremely weird. I wonder if this was some
copy-and-paste from other uffd test code.
Acked-by: David Hildenbrand (Arm) <a class="moz-txt-link-rfc2396E" href="mailto:david@kernel.org"><david@kernel.org></a>
</pre>
</blockquote>
<p data-start="0" data-end="9"><font face="monospace">Hi David,</font></p>
<p data-start="11" data-end="226"><font face="monospace">Yes, the
test operates on hugetlb mappings created with<br
data-start="66" data-end="69">
</font>
<code data-start="69" data-end="97">MAP_HUGETLB | MAP_POPULATE</code><font
face="monospace"> and sets up userfaultfd. Consequently,<br
data-start="136" data-end="139">
registering it with <code data-start="159" data-end="189"
data-is-only-node="">UFFDIO_REGISTER_MODE_MISSING</code> does
not result in<br data-start="208" data-end="211">
any userfaults.</font></p>
<p data-start="228" data-end="523"><font face="monospace">Originally,
the helper function created a separate anonymous mapping and<br
data-start="300" data-end="303">
registered it with userfaultfd instead of the address supplied
by the<br data-start="372" data-end="375">
caller. However, the test operates on hugetlb mappings, and the
registered<br data-start="449" data-end="452">
anonymous mapping is never used in the <code data-start="491"
data-end="501">mremap()</code> path being exercised.</font></p>
<p data-start="525" data-end="651"><font face="monospace">Would it
be better to remove userfaultfd registration entirely from this<br
data-start="597" data-end="600">
test, since that path is not actually being tested?</font></p>
<p data-start="653" data-end="669" data-is-last-node=""
data-is-only-node=""><font face="monospace">Thanks,<br>
Sayali</font></p>
<p><br>
</p>
<p><span style="white-space: pre-wrap"></span></p>
<span style="white-space: pre-wrap">
</span>
</body>
</html>