Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: selftests: Add test coverage for guest_memfd without GUEST_MEMFD_FLAG_MMAP

If a VM type supports KVM_CAP_GUEST_MEMFD_MMAP, the guest_memfd test will
run all test cases with GUEST_MEMFD_FLAG_MMAP set. This leaves the code
path for creating a non-mmap()-able guest_memfd on a VM that supports
mappable guest memfds untested.

Refactor the test to run the main test suite with a given set of flags.
Then, for VM types that support the mappable capability, invoke the test
suite twice: once with no flags, and once with GUEST_MEMFD_FLAG_MMAP
set.

This ensures both creation paths are properly exercised on capable VMs.

Run test_guest_memfd_flags() only once per VM type since it depends only
on the set of valid/supported flags, i.e. iterating over an arbitrary set
of flags is both unnecessary and wrong.

Signed-off-by: Ackerley Tng <ackerleytng@google.com>
[sean: use double-underscores for the inner helper]
Reviewed-by: Fuad Tabba <tabba@google.com>
Tested-by: Fuad Tabba <tabba@google.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Link: https://lore.kernel.org/r/20251003232606.4070510-9-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>

authored by

Ackerley Tng and committed by
Sean Christopherson
df0d9923 21d602ed

+16 -11
+16 -11
tools/testing/selftests/kvm/guest_memfd_test.c
··· 268 268 close(fd); \ 269 269 } while (0) 270 270 271 - static void test_guest_memfd(unsigned long vm_type) 271 + static void __test_guest_memfd(struct kvm_vm *vm, uint64_t flags) 272 272 { 273 - struct kvm_vm *vm; 274 - uint64_t flags; 275 - 276 - vm = vm_create_barebones_type(vm_type); 277 - flags = vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS); 278 - 279 - /* This test doesn't yet support testing mmap() on private memory. */ 280 - if (!(flags & GUEST_MEMFD_FLAG_INIT_SHARED)) 281 - flags &= ~GUEST_MEMFD_FLAG_MMAP; 282 - 283 273 test_create_guest_memfd_multiple(vm); 284 274 test_create_guest_memfd_invalid_sizes(vm, flags); 285 275 ··· 285 295 gmem_test(file_size, vm, flags); 286 296 gmem_test(fallocate, vm, flags); 287 297 gmem_test(invalid_punch_hole, vm, flags); 298 + } 299 + 300 + static void test_guest_memfd(unsigned long vm_type) 301 + { 302 + struct kvm_vm *vm = vm_create_barebones_type(vm_type); 303 + uint64_t flags; 288 304 289 305 test_guest_memfd_flags(vm); 306 + 307 + __test_guest_memfd(vm, 0); 308 + 309 + flags = vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS); 310 + 311 + /* MMAP should always be supported if INIT_SHARED is supported. */ 312 + if (flags & GUEST_MEMFD_FLAG_INIT_SHARED) 313 + __test_guest_memfd(vm, GUEST_MEMFD_FLAG_MMAP | 314 + GUEST_MEMFD_FLAG_INIT_SHARED); 290 315 291 316 kvm_vm_free(vm); 292 317 }