On 8/6/26 22:21, Lorenzo Stoakes (ARM) wrote:
> While maintaining anonymous page offsets for VMAs has no impact for most
> merge cases, it does impact MAP_PRIVATE-mapped file-backed mappings which
> happen to have matching page offset but not matching anonymous page offset.
> 
> Assert this behaviour by attempting to map an unfaulted MAP_PRIVATE-memfd
> region with a faulted one with compatible file page offsets but
> incompatible anonymous page offsets.
> 
> Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
> ---
>  tools/testing/selftests/mm/merge.c | 57 
> ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 57 insertions(+)
> 
> diff --git a/tools/testing/selftests/mm/merge.c 
> b/tools/testing/selftests/mm/merge.c
> index 519e5ac02db7..cb7cdb6b7ada 100644
> --- a/tools/testing/selftests/mm/merge.c
> +++ b/tools/testing/selftests/mm/merge.c
> @@ -1305,6 +1305,63 @@ TEST_F(merge, merge_vmas_with_mseal)
>       ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 2 * page_size);
>  }
>  
> +TEST_F(merge, anon_and_page_offset_mismatch_memfd)
> +{
> +     struct procmap_fd *procmap = &self->procmap;
> +     unsigned int page_size = self->page_size;
> +     char *carveout = self->carveout;
> +     char *ptr, *ptr2;
> +     int fd;
> +
> +     /* Create a 10 page memfd descriptor. */
> +     fd = memfd_create("anon_page_offset_test", MFD_CLOEXEC);
> +     ASSERT_NE(fd, -1);
> +     ASSERT_EQ(ftruncate(fd, 10 * page_size), 0);
> +
> +     /* Map a region using the memfd at page offset 0. */
> +     ptr = mmap(carveout, 5 * page_size, PROT_READ | PROT_WRITE,
> +                MAP_FIXED | MAP_PRIVATE, fd, 0);
> +     ASSERT_NE(ptr, MAP_FAILED);
> +
> +     /*
> +      * Map another separately, and fault in, at page offset 5:
> +      *

"Fault in" is imprecise, as a read-fault won't do. "Trigger a CoW fault." might
be better.


Acked-by: David Hildenbrand (Arm) <[email protected]>

-- 
Cheers,

David

Reply via email to