From: Ackerley Tng <[email protected]>

Add test coverage verifying that creating a guest_memfd backed by an
anonymous tmpfs mount descriptor returned by fsmount() succeeds and
reports the requested file size.

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

diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c 
b/tools/testing/selftests/kvm/guest_memfd_test.c
index e8199ed17b0f8..73212d5307049 100644
--- a/tools/testing/selftests/kvm/guest_memfd_test.c
+++ b/tools/testing/selftests/kvm/guest_memfd_test.c
@@ -541,12 +541,23 @@ static void test_resource_fd_tmpfs_huge(struct kvm_vm *vm)
        close(pool_fd);
 }
 
-#define ____gmem_test(__test, __vm, __flags, __gmem_size, args...)     \
-do {                                                                   \
-       int fd = vm_create_guest_memfd(__vm, __gmem_size, __flags);     \
-                                                                       \
-       test_##__test(args);                                            \
-       close(fd);                                                      \
+#define ____gmem_test(__test, __vm, __flags, __gmem_size, args...)             
\
+do {                                                                           
\
+       int pool_fd = -1;                                                       
\
+       int fd;                                                                 
\
+                                                                               
\
+       if ((__flags) & GUEST_MEMFD_FLAG_USE_RESOURCE) {                        
\
+               pool_fd = create_tmpfs_pool_fd("never", true, __gmem_size);     
\
+               fd = vm_create_guest_memfd_resource(__vm, __gmem_size,          
\
+                                                   __flags, pool_fd);          
\
+       } else {                                                                
\
+               fd = vm_create_guest_memfd(__vm, __gmem_size, __flags); \
+       }                                                                       
\
+                                                                               
\
+       test_##__test(args);                                                    
\
+       close(fd);                                                              
\
+       if (pool_fd >= 0)                                                       
\
+               close(pool_fd);                                                 
\
 } while (0)
 
 #define __gmem_test(__test, __vm, __flags, __gmem_size)                        
\
@@ -606,15 +617,23 @@ static void test_guest_memfd(unsigned long vm_type)
        test_resource_fd_tmpfs_huge(vm);
 
        __test_guest_memfd(vm, 0);
+       __test_guest_memfd(vm, GUEST_MEMFD_FLAG_USE_RESOURCE);
 
        flags = vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS);
-       if (flags & GUEST_MEMFD_FLAG_MMAP)
+       if (flags & GUEST_MEMFD_FLAG_MMAP) {
                __test_guest_memfd(vm, GUEST_MEMFD_FLAG_MMAP);
+               __test_guest_memfd(vm, GUEST_MEMFD_FLAG_MMAP |
+                                      GUEST_MEMFD_FLAG_USE_RESOURCE);
+       }
 
        /* MMAP should always be supported if INIT_SHARED is supported. */
-       if (flags & GUEST_MEMFD_FLAG_INIT_SHARED)
+       if (flags & GUEST_MEMFD_FLAG_INIT_SHARED) {
                __test_guest_memfd(vm, GUEST_MEMFD_FLAG_MMAP |
                                       GUEST_MEMFD_FLAG_INIT_SHARED);
+               __test_guest_memfd(vm, GUEST_MEMFD_FLAG_MMAP |
+                                      GUEST_MEMFD_FLAG_INIT_SHARED |
+                                      GUEST_MEMFD_FLAG_USE_RESOURCE);
+       }
 
        kvm_vm_free(vm);
 }

-- 
2.56.0.rc1.315.gc6ed9934b7-goog



Reply via email to