On Thu, 7 May 2026 at 21:23, Ackerley Tng via B4 Relay <[email protected]> wrote: > > From: Sean Christopherson <[email protected]> > > When adding a memslot associated a guest_memfd instance, create/dup the > guest_memfd before creating the "normal" backing file. This will allow > dup'ing the gmem fd as the normal fd when guest_memfd supports mmap(), > i.e. to make guest_memfd the _only_ backing source for the memslot. > > Signed-off-by: Sean Christopherson <[email protected]> > Signed-off-by: Ackerley Tng <[email protected]>
Reviewed-by: Fuad Tabba <[email protected]> Cheers, /fuad > --- > tools/testing/selftests/kvm/lib/kvm_util.c | 45 > +++++++++++++++--------------- > 1 file changed, 23 insertions(+), 22 deletions(-) > > diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c > b/tools/testing/selftests/kvm/lib/kvm_util.c > index 2a76eca7029d3..df73b23a4c66a 100644 > --- a/tools/testing/selftests/kvm/lib/kvm_util.c > +++ b/tools/testing/selftests/kvm/lib/kvm_util.c > @@ -1054,6 +1054,29 @@ void vm_mem_add(struct kvm_vm *vm, enum > vm_mem_backing_src_type src_type, > if (alignment > 1) > region->mmap_size += alignment; > > + if (flags & KVM_MEM_GUEST_MEMFD) { > + if (guest_memfd < 0) { > + u32 guest_memfd_flags = 0; > + > + TEST_ASSERT(!guest_memfd_offset, > + "Offset must be zero when creating new > guest_memfd"); > + guest_memfd = vm_create_guest_memfd(vm, mem_size, > guest_memfd_flags); > + } else { > + /* > + * Install a unique fd for each memslot so that the fd > + * can be closed when the region is deleted without > + * needing to track if the fd is owned by the > framework > + * or by the caller. > + */ > + guest_memfd = kvm_dup(guest_memfd); > + } > + > + region->region.guest_memfd = guest_memfd; > + region->region.guest_memfd_offset = guest_memfd_offset; > + } else { > + region->region.guest_memfd = -1; > + } > + > region->fd = -1; > if (backing_src_is_shared(src_type)) > region->fd = kvm_memfd_alloc(region->mmap_size, > @@ -1083,28 +1106,6 @@ void vm_mem_add(struct kvm_vm *vm, enum > vm_mem_backing_src_type src_type, > > region->backing_src_type = src_type; > > - if (flags & KVM_MEM_GUEST_MEMFD) { > - if (guest_memfd < 0) { > - u32 guest_memfd_flags = 0; > - TEST_ASSERT(!guest_memfd_offset, > - "Offset must be zero when creating new > guest_memfd"); > - guest_memfd = vm_create_guest_memfd(vm, mem_size, > guest_memfd_flags); > - } else { > - /* > - * Install a unique fd for each memslot so that the fd > - * can be closed when the region is deleted without > - * needing to track if the fd is owned by the > framework > - * or by the caller. > - */ > - guest_memfd = kvm_dup(guest_memfd); > - } > - > - region->region.guest_memfd = guest_memfd; > - region->region.guest_memfd_offset = guest_memfd_offset; > - } else { > - region->region.guest_memfd = -1; > - } > - > region->unused_phy_pages = sparsebit_alloc(); > if (vm_arch_has_protected_memory(vm)) > region->protected_phy_pages = sparsebit_alloc(); > > -- > 2.54.0.563.g4f69b47b94-goog > >
