<!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>