On Fri, 19 Jun 2026 at 01:32, Ackerley Tng via B4 Relay <[email protected]> wrote: > > From: Sean Christopherson <[email protected]> > > Accept gmem_flags in vm_mem_add() to be able to create a guest_memfd within > vm_mem_add(). > > When vm_mem_add() is used to set up a guest_memfd for a memslot, set up the > provided (or created) gmem_fd as the fd for the user memory region. This > makes it available to be mmap()-ed from just like fds from other memory > sources. mmap() from guest_memfd using the provided gmem_flags and > gmem_offset. > > Add a kvm_slot_to_fd() helper to provide convenient access to the file > descriptor of a memslot. > > Update existing callers of vm_mem_add() to pass 0 for gmem_flags to > preserve existing behavior. > > Signed-off-by: Sean Christopherson <[email protected]> > [For guest_memfds, mmap() using gmem_offset instead of 0 all the time.] > Signed-off-by: Ackerley Tng <[email protected]>
Reviewed-by: Fuad Tabba <[email protected]> Cheers, /fuad > --- > tools/testing/selftests/kvm/include/kvm_util.h | 7 +++++- > tools/testing/selftests/kvm/lib/kvm_util.c | 27 > ++++++++++++---------- > .../kvm/x86/private_mem_conversions_test.c | 2 +- > 3 files changed, 22 insertions(+), 14 deletions(-) > > diff --git a/tools/testing/selftests/kvm/include/kvm_util.h > b/tools/testing/selftests/kvm/include/kvm_util.h > index d4c104cb0418f..0cacf3698b259 100644 > --- a/tools/testing/selftests/kvm/include/kvm_util.h > +++ b/tools/testing/selftests/kvm/include/kvm_util.h > @@ -700,7 +700,7 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, > gpa_t gpa, u32 slot, u64 npages, u32 flags); > void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, > gpa_t gpa, u32 slot, u64 npages, u32 flags, > - int gmem_fd, u64 gmem_offset); > + int gmem_fd, u64 gmem_offset, u64 gmem_flags); > > #ifndef vm_arch_has_protected_memory > static inline bool vm_arch_has_protected_memory(struct kvm_vm *vm) > @@ -732,6 +732,11 @@ void *addr_gva2hva(struct kvm_vm *vm, gva_t gva); > gpa_t addr_hva2gpa(struct kvm_vm *vm, void *hva); > void *addr_gpa2alias(struct kvm_vm *vm, gpa_t gpa); > > +static inline int kvm_slot_to_fd(struct kvm_vm *vm, u32 slot) > +{ > + return memslot2region(vm, slot)->fd; > +} > + > #ifndef vcpu_arch_put_guest > #define vcpu_arch_put_guest(mem, val) do { (mem) = (val); } while (0) > #endif > diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c > b/tools/testing/selftests/kvm/lib/kvm_util.c > index 9b482778f7379..d5bbc80b2bf1c 100644 > --- a/tools/testing/selftests/kvm/lib/kvm_util.c > +++ b/tools/testing/selftests/kvm/lib/kvm_util.c > @@ -978,12 +978,13 @@ void vm_set_user_memory_region2(struct kvm_vm *vm, u32 > slot, u32 flags, > /* FIXME: This thing needs to be ripped apart and rewritten. */ > void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, > gpa_t gpa, u32 slot, u64 npages, u32 flags, > - int gmem_fd, u64 gmem_offset) > + int gmem_fd, u64 gmem_offset, u64 gmem_flags) > { > int ret; > struct userspace_mem_region *region; > size_t backing_src_pagesz = get_backing_src_pagesz(src_type); > size_t mem_size = npages * vm->page_size; > + off_t mmap_offset = 0; > size_t alignment = 1; > > TEST_REQUIRE_SET_USER_MEMORY_REGION2(); > @@ -1055,8 +1056,6 @@ void vm_mem_add(struct kvm_vm *vm, enum > vm_mem_backing_src_type src_type, > > if (flags & KVM_MEM_GUEST_MEMFD) { > if (gmem_fd < 0) { > - u32 gmem_flags = 0; > - > TEST_ASSERT(!gmem_offset, > "Offset must be zero when creating new > guest_memfd"); > gmem_fd = vm_create_guest_memfd(vm, mem_size, > gmem_flags); > @@ -1077,13 +1076,17 @@ void vm_mem_add(struct kvm_vm *vm, enum > vm_mem_backing_src_type src_type, > } > > region->fd = -1; > - if (backing_src_is_shared(src_type)) > + if (flags & KVM_MEM_GUEST_MEMFD && gmem_flags & > GUEST_MEMFD_FLAG_MMAP) { > + region->fd = kvm_dup(gmem_fd); > + mmap_offset = gmem_offset; > + } else if (backing_src_is_shared(src_type)) { > region->fd = kvm_memfd_alloc(region->mmap_size, > src_type == > VM_MEM_SRC_SHARED_HUGETLB); > + } > > - region->mmap_start = kvm_mmap(region->mmap_size, PROT_READ | > PROT_WRITE, > - > vm_mem_backing_src_alias(src_type)->flag, > - region->fd); > + region->mmap_start = __kvm_mmap(region->mmap_size, PROT_READ | > PROT_WRITE, > + > vm_mem_backing_src_alias(src_type)->flag, > + region->fd, mmap_offset); > > TEST_ASSERT(!is_backing_src_hugetlb(src_type) || > region->mmap_start == align_ptr_up(region->mmap_start, > backing_src_pagesz), > @@ -1129,10 +1132,10 @@ void vm_mem_add(struct kvm_vm *vm, enum > vm_mem_backing_src_type src_type, > > /* If shared memory, create an alias. */ > if (region->fd >= 0) { > - region->mmap_alias = kvm_mmap(region->mmap_size, > - PROT_READ | PROT_WRITE, > - > vm_mem_backing_src_alias(src_type)->flag, > - region->fd); > + region->mmap_alias = __kvm_mmap(region->mmap_size, > + PROT_READ | PROT_WRITE, > + > vm_mem_backing_src_alias(src_type)->flag, > + region->fd, mmap_offset); > > /* Align host alias address */ > region->host_alias = align_ptr_up(region->mmap_alias, > alignment); > @@ -1143,7 +1146,7 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, > enum vm_mem_backing_src_type src_type, > gpa_t gpa, u32 slot, u64 npages, u32 flags) > { > - vm_mem_add(vm, src_type, gpa, slot, npages, flags, -1, 0); > + vm_mem_add(vm, src_type, gpa, slot, npages, flags, -1, 0, 0); > } > > /* > diff --git a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c > b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c > index 1d2f5d4fd45d7..861baff201e78 100644 > --- a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c > +++ b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c > @@ -399,7 +399,7 @@ static void test_mem_conversions(enum > vm_mem_backing_src_type src_type, u32 nr_v > for (i = 0; i < nr_memslots; i++) > vm_mem_add(vm, src_type, BASE_DATA_GPA + slot_size * i, > BASE_DATA_SLOT + i, slot_size / vm->page_size, > - KVM_MEM_GUEST_MEMFD, memfd, slot_size * i); > + KVM_MEM_GUEST_MEMFD, memfd, slot_size * i, 0); > > for (i = 0; i < nr_vcpus; i++) { > gpa_t gpa = BASE_DATA_GPA + i * per_cpu_size; > > -- > 2.55.0.rc0.738.g0c8ab3ebcc-goog > >
