On Fri, 19 Jun 2026 at 01:32, Ackerley Tng via B4 Relay <[email protected]> wrote: > > From: Sean Christopherson <[email protected]> > > Skip setting memory to private in the private memory exits test when using > per-gmem memory attributes, as memory is initialized to private by default > for guest_memfd, and using vm_mem_set_private() on a guest_memfd instance > requires creating guest_memfd with GUEST_MEMFD_FLAG_MMAP (which is totally > doable, but would need to be conditional and is ultimately unnecessary). > > Expect an emulated MMIO instead of a memory fault exit when attributes are > per-gmem, as deleting the memslot effectively drops the private status, > i.e. the GPA becomes shared and thus supports emulated MMIO. > > Skip the "memslot not private" test entirely, as private vs. shared state > for x86 software-protected VMs comes from the memory attributes themselves, > and so when doing in-place conversions there can never be a disconnect > between the expected and actual states. > > Signed-off-by: Sean Christopherson <[email protected]>
Reviewed-by: Fuad Tabba <[email protected]> Cheers, /fuad > --- > .../selftests/kvm/x86/private_mem_kvm_exits_test.c | 36 > ++++++++++++++++++---- > 1 file changed, 30 insertions(+), 6 deletions(-) > > diff --git a/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c > b/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c > index 10db9fe6d9063..70ed16066c63e 100644 > --- a/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c > +++ b/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c > @@ -62,8 +62,9 @@ static void test_private_access_memslot_deleted(void) > > virt_map(vm, EXITS_TEST_GVA, EXITS_TEST_GPA, EXITS_TEST_NPAGES); > > - /* Request to access page privately */ > - vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE); > + /* Request to access page privately. */ > + if (!kvm_has_gmem_attributes) > + vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE); > > pthread_create(&vm_thread, NULL, > (void *(*)(void *))run_vcpu_get_exit_reason, > @@ -74,10 +75,26 @@ static void test_private_access_memslot_deleted(void) > pthread_join(vm_thread, &thread_return); > exit_reason = (u32)(u64)thread_return; > > - TEST_ASSERT_EQ(exit_reason, KVM_EXIT_MEMORY_FAULT); > - TEST_ASSERT_EQ(vcpu->run->memory_fault.flags, > KVM_MEMORY_EXIT_FLAG_PRIVATE); > - TEST_ASSERT_EQ(vcpu->run->memory_fault.gpa, EXITS_TEST_GPA); > - TEST_ASSERT_EQ(vcpu->run->memory_fault.size, EXITS_TEST_SIZE); > + /* > + * If attributes are tracked per-gmem, deleting the memslot that > points > + * at the gmem instance effectively makes the memory shared, and so > the > + * read should trigger emulated MMIO. > + * > + * If attributes are tracked per-VM, deleting the memslot shouldn't > + * affect the private attribute, and so KVM should generate a memory > + * fault exit (emulated MMIO on private GPAs is disallowed). > + */ > + if (kvm_has_gmem_attributes) { > + TEST_ASSERT_EQ(exit_reason, KVM_EXIT_MMIO); > + TEST_ASSERT_EQ(vcpu->run->mmio.phys_addr, EXITS_TEST_GPA); > + TEST_ASSERT_EQ(vcpu->run->mmio.len, sizeof(u64)); > + TEST_ASSERT_EQ(vcpu->run->mmio.is_write, false); > + } else { > + TEST_ASSERT_EQ(exit_reason, KVM_EXIT_MEMORY_FAULT); > + TEST_ASSERT_EQ(vcpu->run->memory_fault.flags, > KVM_MEMORY_EXIT_FLAG_PRIVATE); > + TEST_ASSERT_EQ(vcpu->run->memory_fault.gpa, EXITS_TEST_GPA); > + TEST_ASSERT_EQ(vcpu->run->memory_fault.size, EXITS_TEST_SIZE); > + } > > kvm_vm_free(vm); > } > @@ -88,6 +105,13 @@ static void test_private_access_memslot_not_private(void) > struct kvm_vcpu *vcpu; > u32 exit_reason; > > + /* > + * Accessing non-private memory as private with a software-protected > VM > + * isn't possible when doing in-place conversions. > + */ > + if (kvm_has_gmem_attributes) > + return; > + > vm = vm_create_shape_with_one_vcpu(protected_vm_shape, &vcpu, > guest_repeatedly_read); > > > -- > 2.55.0.rc0.738.g0c8ab3ebcc-goog > >
