On 6/16/2026 7:46 AM, Ackerley Tng wrote:
Lisa Wang <[email protected]> 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.

we need to check KVM_CAP_GUEST_MEMFD_FLAGS or kvm_has_gmem_attributes.


Reply via email to