From: Ackerley Tng <[email protected]>

Test that a guest vCPU can execute instructions and read/write memory
mapped into a guest_memfd instance that is backed by a tmpfs resource
pool descriptor.

Signed-off-by: Ackerley Tng <[email protected]>
---
 tools/testing/selftests/kvm/guest_memfd_test.c | 57 ++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)

diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c 
b/tools/testing/selftests/kvm/guest_memfd_test.c
index 345b41c912a18..bf369874f2647 100644
--- a/tools/testing/selftests/kvm/guest_memfd_test.c
+++ b/tools/testing/selftests/kvm/guest_memfd_test.c
@@ -829,6 +829,62 @@ static void test_guest_memfd_guest(void)
        kvm_vm_free(vm);
 }
 
+static void test_guest_memfd_guest_resource(void)
+{
+       const gpa_t gpa = SZ_4G;
+       const int slot = 1;
+       struct kvm_vcpu *vcpu;
+       struct kvm_vm *vm;
+       int pool_fd, fd, i;
+       size_t size;
+       u8 *mem;
+
+       if (!kvm_check_cap(KVM_CAP_GUEST_MEMFD_FLAGS))
+               return;
+
+       pool_fd = create_tmpfs_pool_fd("never", true, page_size);
+       if (pool_fd < 0)
+               TEST_REQUIRE(false);
+
+       vm = __vm_create_shape_with_one_vcpu(VM_SHAPE_DEFAULT, &vcpu, 1, 
guest_code);
+
+       TEST_ASSERT(vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS) & 
GUEST_MEMFD_FLAG_MMAP,
+                   "Default VM type should support MMAP, supported flags = 
0x%x",
+                   vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS));
+       TEST_ASSERT(vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS) & 
GUEST_MEMFD_FLAG_INIT_SHARED,
+                   "Default VM type should support INIT_SHARED, supported 
flags = 0x%x",
+                   vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS));
+
+       size = max_t(size_t, vm->page_size, page_size);
+       fd = __vm_create_guest_memfd_resource(vm, size,
+                                             GUEST_MEMFD_FLAG_MMAP |
+                                             GUEST_MEMFD_FLAG_INIT_SHARED |
+                                             GUEST_MEMFD_FLAG_USE_RESOURCE,
+                                             pool_fd);
+       TEST_ASSERT(fd >= 0, "guest_memfd with tmpfs pool should succeed");
+
+       vm_set_user_memory_region2(vm, slot, KVM_MEM_GUEST_MEMFD, gpa, size, 
NULL, fd, 0);
+
+       mem = kvm_mmap(size, PROT_READ | PROT_WRITE, MAP_SHARED, fd);
+       memset(mem, 0xaa, size);
+       kvm_munmap(mem, size);
+
+       virt_map(vm, gpa, gpa, size / vm->page_size);
+       vcpu_args_set(vcpu, 2, gpa, size);
+       vcpu_run(vcpu);
+
+       TEST_ASSERT_EQ(get_ucall(vcpu, NULL), UCALL_DONE);
+
+       mem = kvm_mmap(size, PROT_READ | PROT_WRITE, MAP_SHARED, fd);
+       for (i = 0; i < size; i++)
+               TEST_ASSERT_EQ(mem[i], 0xff);
+
+       close(fd);
+       close(pool_fd);
+       kvm_vm_free(vm);
+}
+
+
 int main(int argc, char *argv[])
 {
        unsigned long vm_types, vm_type;
@@ -849,4 +905,5 @@ int main(int argc, char *argv[])
                test_guest_memfd(vm_type);
 
        test_guest_memfd_guest();
+       test_guest_memfd_guest_resource();
 }

-- 
2.56.0.rc1.315.gc6ed9934b7-goog



Reply via email to