* [to-be-updated] mm-selftests-adjust-the-madv_collapse-uffd-minor-selftests.patch removed from -mm tree
@ 2026-09-17 5:37 Andrew Morton
0 siblings, 0 replies; only message in thread
From: Andrew Morton @ 2026-09-17 5:37 UTC (permalink / raw)
To: mm-commits, zokeefe, ziy, shy828301, ryan.roberts, ljs, liam,
lance.yang, kas, hughd, dev.jain, david, baolin.wang, baohua,
jthoughton, akpm
The quilt patch titled
Subject: mm: selftests: adjust the MADV_COLLAPSE uffd-minor selftests
has been removed from the -mm tree. Its filename was
mm-selftests-adjust-the-madv_collapse-uffd-minor-selftests.patch
This patch was dropped because an updated version will be issued
------------------------------------------------------
From: James Houghton <jthoughton@google.com>
Subject: mm: selftests: adjust the MADV_COLLAPSE uffd-minor selftests
Date: Thu, 10 Sep 2026 02:34:11 +0000
The behavior of MADV_COLLAPSE with uffd-minor VMAs has changed:
MADV_COLLAPSE will no longer install PTEs where none existed before.
Update the selftest to demonstrate this new behavior.
On an unpatched kernel, the test will hit "unexpected memory contents
after collapse".
If the selftest is left unpatched but the kernel is patched, the selftest
will SKIP when it gets EINVAL back from MADV_COLLAPSE.
Link: https://lore.kernel.org/20260910023411.514987-2-jthoughton@google.com
Signed-off-by: James Houghton <jthoughton@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Barry Song <baohua@kernel.org>
Cc: David Hildenbrand <david@kernel.org>
Cc: Dev Jain <dev.jain@arm.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Kiryl Shutsemau <kas@kernel.org>
Cc: Lance Yang <lance.yang@linux.dev>
Cc: Liam R. Howlett <liam@infradead.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Yang Shi <shy828301@gmail.com>
Cc: Zach O'Keefe <zokeefe@google.com>
Cc: Zi Yan <ziy@nvidia.com>
---
tools/testing/selftests/mm/uffd-unit-tests.c | 75 +++++++++++++++--
1 file changed, 68 insertions(+), 7 deletions(-)
--- a/tools/testing/selftests/mm/uffd-unit-tests.c~mm-selftests-adjust-the-madv_collapse-uffd-minor-selftests
+++ a/tools/testing/selftests/mm/uffd-unit-tests.c
@@ -518,19 +518,34 @@ static void uffd_wp_fork_pin_with_event_
uffd_wp_fork_pin_test_common(gopts, args, true);
}
-static void check_memory_contents(uffd_global_test_opts_t *gopts, char *p)
+static int __check_memory_contents(unsigned long offset,
+ unsigned long nr_pages,
+ uffd_global_test_opts_t *gopts,
+ char *p)
{
unsigned long i, j;
uint8_t expected_byte;
- for (i = 0; i < gopts->nr_pages; ++i) {
+ if (nr_pages + offset < nr_pages)
+ err("overflow in memory check");
+ if (nr_pages + offset > gopts->nr_pages)
+ err("out of bounds memory check");
+
+ for (i = offset; i < offset + nr_pages; ++i) {
expected_byte = ~((uint8_t)(i % ((uint8_t)-1)));
for (j = 0; j < gopts->page_size; j++) {
uint8_t v = *(uint8_t *)(p + (i * gopts->page_size) + j);
if (v != expected_byte)
- err("unexpected page contents");
+ return 1;
}
}
+
+ return 0;
+}
+
+static int check_memory_contents(uffd_global_test_opts_t *gopts, char *p)
+{
+ return __check_memory_contents(0, gopts->nr_pages, gopts, p);
}
static void uffd_minor_test_common(uffd_global_test_opts_t *gopts, bool test_collapse, bool test_wp)
@@ -539,6 +554,8 @@ static void uffd_minor_test_common(uffd_
pthread_t uffd_mon;
char c = '\0';
struct uffd_args args = { 0 };
+ unsigned long checked = 0;
+ bool bad_contents;
args.gopts = gopts;
/*
@@ -564,24 +581,65 @@ static void uffd_minor_test_common(uffd_
if (pthread_create(&uffd_mon, NULL, uffd_poll_thread, &args))
err("uffd_poll_thread create");
+ if (test_collapse) {
+ /*
+ * Read just a single page and try collapsing. The collapse
+ * should either be rejected or be a no-op.
+ */
+ if (__check_memory_contents(0, 1, gopts, gopts->area_dst_alias))
+ err("unexpected memory contents before collapse");
+
+ /* MADV_COLLAPSE might return EINVAL for uffd-minor VMAs. */
+ madvise(gopts->area_dst_alias, gopts->nr_pages * gopts->page_size,
+ MADV_COLLAPSE);
+ /*
+ * If the above collapse mapped pages that were not explicitly
+ * CONTINUE'd, the below __check_memory_contents() will not
+ * fault on some pages, resulting in incorrect contents. The
+ * PTE for the first page may get retracted, so avoid checking
+ * that page, as we might take a second fault, flipping the
+ * contents a second time.
+ */
+ checked = 1;
+ }
+
/*
* Read each of the pages back using the UFFD-registered mapping. We
* expect that the first time we touch a page, it will result in a minor
* fault. uffd_poll_thread will resolve the fault by bit-flipping the
* page's contents, and then issuing a CONTINUE ioctl.
*/
- check_memory_contents(gopts, gopts->area_dst_alias);
+ bad_contents = !!__check_memory_contents(checked, gopts->nr_pages - checked,
+ gopts, gopts->area_dst_alias);
if (write(gopts->pipefd[1], &c, sizeof(c)) != sizeof(c))
err("pipe write");
if (pthread_join(uffd_mon, NULL))
err("join() failed");
+ if (bad_contents && test_collapse) {
+ uffd_test_fail("unexpected memory contents after collapse");
+ return;
+ }
+
+ if (bad_contents) {
+ uffd_test_fail("unexpected memory contents");
+ return;
+ }
+
if (test_collapse) {
+ /*
+ * MADV_COLLAPSE will fail unless userfaultfd-minor is
+ * unregistered.
+ */
+ if (uffd_unregister(gopts->uffd, gopts->area_dst_alias,
+ gopts->nr_pages * gopts->page_size))
+ err("uffd_unregister before MADV_COLLAPSE failed");
+
+ /* MADV_COLLAPSE should succeed with userfaultfd unregistered. */
if (madvise(gopts->area_dst_alias, gopts->nr_pages * gopts->page_size,
MADV_COLLAPSE)) {
- /* It's fine to fail for this one... */
- uffd_test_skip("MADV_COLLAPSE failed");
+ uffd_test_fail("MADV_COLLAPSE failed");
return;
}
@@ -593,7 +651,10 @@ static void uffd_minor_test_common(uffd_
* This won't cause uffd-fault - it purely just makes sure there
* was no corruption.
*/
- check_memory_contents(gopts, gopts->area_dst_alias);
+ if (check_memory_contents(gopts, gopts->area_dst_alias)) {
+ uffd_test_fail("unexpected memory contents");
+ return;
+ }
}
if (args.missing_faults != 0 || args.minor_faults != gopts->nr_pages)
_
Patches currently in -mm which might be from jthoughton@google.com are
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-09-17 5:37 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-17 5:37 [to-be-updated] mm-selftests-adjust-the-madv_collapse-uffd-minor-selftests.patch removed from -mm tree Andrew Morton
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.