[PATCH RFC v2 09/50] KVM: selftests: Test rejection of memfd for resource_fd
From: Ackerley Tng via B4 Relay
Date: Thu Oct 22 2026 - 19:34:00 EST
From: Ackerley Tng <ackerleytng@xxxxxxxxxx>
Add test coverage verifying that passing an fd created via memfd_create
as a resource file fails with EOPNOTSUPP, because regular files do not
implement gmem_provider_ops. Only directory file descriptors representing
the mount root are supported as resource pools.
Signed-off-by: Ackerley Tng <ackerleytng@xxxxxxxxxx>
---
tools/testing/selftests/kvm/guest_memfd_test.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c
index 445396860d819..d62ae23256083 100644
--- a/tools/testing/selftests/kvm/guest_memfd_test.c
+++ b/tools/testing/selftests/kvm/guest_memfd_test.c
@@ -457,6 +457,27 @@ static void test_resource_fd_unsupported_fs(struct kvm_vm *vm)
close(file_fd);
}
+static void test_resource_fd_memfd(struct kvm_vm *vm)
+{
+ int fd, file_fd;
+
+ /*
+ * Passing an fd returned by memfd_create is rejected with EOPNOTSUPP
+ * because regular files do not have gmem_provider_ops defined on their
+ * f_op. Only directory FDs representing the mount root are supported
+ * resource pools.
+ */
+ file_fd = memfd_create("test_memfd", 0);
+ TEST_ASSERT(file_fd >= 0, "memfd_create failed");
+
+ fd = __vm_create_guest_memfd_resource(vm, page_size,
+ GUEST_MEMFD_FLAG_USE_RESOURCE,
+ file_fd);
+ TEST_ASSERT(fd < 0, "guest_memfd with memfd should fail");
+ TEST_ASSERT_EQ(errno, EOPNOTSUPP);
+ close(file_fd);
+}
+
#define ____gmem_test(__test, __vm, __flags, __gmem_size, args...) \
do { \
int fd = vm_create_guest_memfd(__vm, __gmem_size, __flags); \
@@ -517,6 +538,7 @@ static void test_guest_memfd(unsigned long vm_type)
test_resource_fd_invalid(vm);
test_resource_fd_unsupported_fs(vm);
+ test_resource_fd_memfd(vm);
__test_guest_memfd(vm, 0);
--
2.56.0.257.gf7497c7d27-goog