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]>
---
 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 eef6de9a7f4b1..e35c65a173606 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1026,6 +1026,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) {
+                       uint32_t 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,
@@ -1055,28 +1078,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) {
-                       uint32_t 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.51.0.858.gf9c4a03a3a-goog


Reply via email to