Re: [PATCH v15 13/23] KVM: selftests: Support guest_memfd in-place conversion
From: Xiaoyao Li
Date: Mon Oct 12 2026 - 01:11:46 EST
On 10/10/2026 11:32 AM, Binbin Wu wrote:
> On 10/2/2026 3:37 AM, Lisa Wang wrote:
>> With guest_memfd in-place conversion, the memory region can be set as
>> shared, eliminating the need for dual-backed memory.
>>
>> By setting the region to shared initially, the KVM selftest framework
>> can populate the mmap()-ed guest_memfd memory just like any standard
>> memory provider.
>>
>> For CoCo VMs, pages that need to be private are explicitly set to
>> private before executing the VM.
>>
>> Signed-off-by: Lisa Wang <wyihan@xxxxxxxxxx>
>> ---
>> tools/testing/selftests/kvm/lib/kvm_util.c | 20 ++++++++++++++------
>> tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c | 6 +++++-
>> 2 files changed, 19 insertions(+), 7 deletions(-)
>>
>> diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
>> index 7625908caf21..f474664b5d92 100644
>> --- a/tools/testing/selftests/kvm/lib/kvm_util.c
>> +++ b/tools/testing/selftests/kvm/lib/kvm_util.c
>> @@ -494,8 +494,10 @@ struct kvm_vm *__vm_create(struct vm_shape shape, u32 nr_runnable_vcpus,
>> u64 nr_pages = vm_nr_pages_required(shape.mode, nr_runnable_vcpus,
>> nr_extra_pages);
>> struct userspace_mem_region *slot0;
>> + u64 gmem_flags = 0;
>> struct kvm_vm *vm;
>> - int i, flags;
>> + int flags = 0;
>> + int i;
>>
>> kvm_set_files_rlimit(nr_runnable_vcpus);
>>
>> @@ -505,14 +507,20 @@ struct kvm_vm *__vm_create(struct vm_shape shape, u32 nr_runnable_vcpus,
>> vm = ____vm_create(shape);
>>
>> /*
>> - * Force GUEST_MEMFD for the primary memory region if necessary, e.g.
>> - * for CoCo VMs that require GUEST_MEMFD backed private memory.
>> + * Force GUEST_MEMFD for the primary memory region if necessary, and
>> + * initialize it as shared if in-place conversion is supported, so the
>> + * selftest framework can populate it exactly like other memory
>> + * providers.
>> */
>> - flags = 0;
>> - if (is_guest_memfd_required(shape))
>> + if (is_guest_memfd_required(shape)) {
>> flags |= KVM_MEM_GUEST_MEMFD;
>> + if (kvm_has_gmem_attributes)
>> + gmem_flags |= GUEST_MEMFD_FLAG_INIT_SHARED |
>> + GUEST_MEMFD_FLAG_MMAP;
>> + }
>>
>> - vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, 0, 0, nr_pages, flags);
>> + vm_mem_add(vm, VM_MEM_SRC_ANONYMOUS, 0, 0, nr_pages, flags,
>> + -1, 0, gmem_flags);
> This is common for both TDX and SNP, does it break SNP?
As I commented in the v14[1], I still believe this part belongs to gmem in-place
conversion series. Without this part, I think the SNP selftests will fail if
in-place conversion is enabled.
Ackerley, did you test SNP selftests?
[1] https://lore.kernel.org/kvm/f7b3a63c-7a1d-445f-b062-4cea5343d266@xxxxxxxxx/