Re: [PATCH v13 13/22] KVM: selftests: Set first memory region as shared if guest_memfd

From: Ackerley Tng

Date: Tue Jun 30 2026 - 14:18:35 EST


Xiaoyao Li <xiaoyao.li@xxxxxxxxx> writes:

> On 6/16/2026 7:46 AM, Ackerley Tng wrote:
>> Lisa Wang <wyihan@xxxxxxxxxx> writes:
>>
>>> Set the initial state of the first memory region as shared if it is
>>> backed by guest_memfd, so that the KVM selftest framework functions can
>>> populate mmap()-ed guest_memfd memory the same way memory from other
>>> memory providers are populated.
>>>
>>> For CoCo VMs, pages that need to be private are explicitly set to
>>> private before executing the VM.
>>>
>>>
>>> [...snip...]
>>>
>>> @@ -495,14 +497,16 @@ 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 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;
>>> + gmem_flags |= GUEST_MEMFD_FLAG_INIT_SHARED;
>>> + }
>>>
>>
>> Just noticed this while hacking some SNP tests.
>>
>>> - 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);
>>> for (i = 0; i < NR_MEM_REGIONS; i++)
>>> vm->memslots[i] = 0;
>>>
>>>
>>> --
>>> 2.54.0.746.g67dd491aae-goog
>>
>> I think this patch should fully buy into in-place conversions, so we
>> need to also set GUEST_MEMFD_FLAG_MMAP:
>>
>> @@ -483,6 +483,7 @@ 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);
>> + enum vm_mem_backing_src_type src_type = VM_MEM_SRC_ANONYMOUS;
>> struct userspace_mem_region *slot0;
>> u64 gmem_flags = 0;
>> struct kvm_vm *vm;
>> @@ -503,10 +504,16 @@ struct kvm_vm *__vm_create(struct vm_shape
>> shape, u32 nr_runnable_vcpus,
>> */
>> if (is_guest_memfd_required(shape)) {
>> flags |= KVM_MEM_GUEST_MEMFD;
>> - gmem_flags |= GUEST_MEMFD_FLAG_INIT_SHARED;
>> + gmem_flags |= GUEST_MEMFD_FLAG_INIT_SHARED | GUEST_MEMFD_FLAG_MMAP;
>
> GUEST_MEMFD_FLAG_INIT_SHARED is valid only when the memory attributes is
> per-gmem.
>

GUEST_MEMFD_FLAG_INIT_SHARED was introduced before guest_memfd in-place
conversions, so I think it's orthogonal to whether memory attributes is
per-gmem.

> we need to check KVM_CAP_GUEST_MEMFD_FLAGS or kvm_has_gmem_attributes.

I think we do want to deprecate the non-in-place-conversions setup, so
how about inserting a TEST_REQIRE(kvm_has_gmem_attributes) here?