On Fri, 19 Jun 2026 at 01:32, Ackerley Tng via B4 Relay <[email protected]> wrote: > > From: Ackerley Tng <[email protected]> > > Add a guest_memfd selftest to verify that memory conversions work > correctly with allocated folios in different layouts. > > By iterating through which pages are initially faulted, the test covers > various layouts of contiguous allocated and unallocated regions, exercising > conversion with different range layouts. > > Signed-off-by: Ackerley Tng <[email protected]> > Co-developed-by: Sean Christopherson <[email protected]> > Signed-off-by: Sean Christopherson <[email protected]>
Reviewed-by: Fuad Tabba <[email protected]> Cheers, /fuad > --- > .../kvm/x86/guest_memfd_conversions_test.c | 30 > ++++++++++++++++++++++ > 1 file changed, 30 insertions(+) > > diff --git a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c > b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c > index b43ac196330f1..0b024fb7227f0 100644 > --- a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c > +++ b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c > @@ -279,6 +279,36 @@ > GMEM_CONVERSION_TEST_INIT_PRIVATE(before_allocation_private) > test_convert_to_shared(t, 0, 0, 'A', 'B'); > } > > +/* > + * Test that when some of the folios in the conversion range are allocated, > + * conversion requests are handled correctly in guest_memfd. Vary the ranges > + * allocated before conversion, using test_page, to cover various layouts of > + * contiguous allocated and unallocated regions. > + */ > +GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(unallocated_folios, 8) > +{ > + const int second_page_to_fault = 4; > + int i; > + > + /* > + * Fault 2 of the pages to test filemap range operations except when > + * test_page == second_page_to_fault. > + */ > + host_do_rmw(t->mem, test_page, 0, 'A'); > + if (test_page != second_page_to_fault) > + host_do_rmw(t->mem, second_page_to_fault, 0, 'A'); > + > + gmem_set_private(t->gmem_fd, 0, nr_pages * page_size); > + for (i = 0; i < nr_pages; ++i) { > + char expected = (i == test_page || i == second_page_to_fault) > ? 'A' : 0; > + > + test_private(t, i, expected, 'B'); > + } > + > + for (i = 0; i < nr_pages; ++i) > + test_convert_to_shared(t, i, 'B', 'C', 'D'); > +} > + > int main(int argc, char *argv[]) > { > TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & > BIT(KVM_X86_SW_PROTECTED_VM)); > > -- > 2.55.0.rc0.738.g0c8ab3ebcc-goog > >
