Xiaoyao Li <[email protected]> writes: > 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. >
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?

