On Tue, Apr 22, 2025 at 11:37:57AM +0100, Ryan Roberts wrote: > On 13/02/2025 18:17, Lorenzo Stoakes wrote: > > Extend the guard region tests to allow for test fixture variants for anon, > > shmem, and local file files. > > > > This allows us to assert that each of the expected behaviours of anonymous > > memory also applies correctly to file-backed (both shmem and an a file > > created locally in the current working directory) and thus asserts the same > > correctness guarantees as all the remaining tests do. > > > > The fixture teardown is now performed in the parent process rather than > > child forked ones, meaning cleanup is always performed, including unlinking > > any generated temporary files. > > > > Additionally the variant fixture data type now contains an enum value > > indicating the type of backing store and the mmap() invocation is > > abstracted to allow for the mapping of whichever backing store the variant > > is testing. > > > > We adjust tests as necessary to account for the fact they may now reference > > files rather than anonymous memory. > > Hi Lorenzo, > > I'm getting a test failure in v6.15-rc3 on arm64: > > ----8<---- > # RUN guard_regions.shmem.uffd ... > # guard-regions.c:1467:uffd:Expected ioctl(uffd, UFFDIO_REGISTER, ®) (-1) > == > 0 (0) > # uffd: Test terminated by assertion > # FAIL guard_regions.shmem.uffd > not ok 45 guard_regions.shmem.uffd > ----8<---- > > The ioctl is returning EINVAL.
Hm strange, that works fine <resists urge to say 'on my machine'> on x86-64. Is userfaultfd enabled in your config, to ask a silly question? It'd be odd for this to vary depending upon arch. So a factor here is a _stupidity_ in the testing - does your system mount /tmp as tmpfs or an actual file system? As the test code unconditionally assumes /tmp is indeed going to get you a shmem file. It's shameful to be honest. But actually I suspect this more than anything else... > > [...] > > > @@ -1281,6 +1398,9 @@ TEST_F(guard_regions, uffd) > > struct uffdio_register reg; > > struct uffdio_range range; > > > > + if (!is_anon_backed(variant)) > > Perhaps this should be filtering out shmem too? Although the manual for > userfaultfd implies that shmem is supported: Yeah it should work with it fine. > > """ > Up to Linux 4.11, userfaultfd can be used only with anonymous private memory > mappings. Since Linux 4.11, userfaultfd can be also used with hugetlbfs and > shared memory mappings. > """ > > But I'm not sure if that's referring specifically to > UFFDIO_REGISTER_MODE_MISSING? > > Any ideas before I start debugging further? > > Thanks, > Ryan > > > + SKIP(return, "uffd only works on anon backing"); > > + > > /* Set up uffd. */ > > uffd = userfaultfd(0); > > if (uffd == -1 && errno == EPERM) > > @@ -1290,8 +1410,8 @@ TEST_F(guard_regions, uffd) > > ASSERT_EQ(ioctl(uffd, UFFDIO_API, &api), 0); > > > > /* Map 10 pages. */ > > - ptr = mmap(NULL, 10 * page_size, PROT_READ | PROT_WRITE, > > - MAP_ANON | MAP_PRIVATE, -1, 0); > > + ptr = mmap_(self, variant, NULL, 10 * page_size, > > + PROT_READ | PROT_WRITE, 0, 0); > > ASSERT_NE(ptr, MAP_FAILED); > > > > /* Register the range with uffd. */ >