[LTP] [PATCH 1/1] lib: dirtyc0w_shmem: userfaultfd01: Add safe_userfaultfd()
    Petr Vorel 
    pvorel@suse.cz
       
    Thu Oct 30 20:25:43 CET 2025
    
    
  
Use TINFO in tst_res() followed by tst_brk(TBROK, ...).
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
NOTE: SAFE_USERFAULTFD() could be used also in Wei's mremap07.c
https://patchwork.ozlabs.org/project/ltp/patch/20251030054029.23511-1-wegao@suse.com/
 include/lapi/userfaultfd.h                    | 33 +++++++++++++++++++
 .../dirtyc0w_shmem/dirtyc0w_shmem_child.c     | 15 +--------
 .../syscalls/userfaultfd/userfaultfd01.c      | 18 +---------
 3 files changed, 35 insertions(+), 31 deletions(-)
diff --git a/include/lapi/userfaultfd.h b/include/lapi/userfaultfd.h
index 4d52b7c4bb..8c9482c3d1 100644
--- a/include/lapi/userfaultfd.h
+++ b/include/lapi/userfaultfd.h
@@ -2,6 +2,7 @@
 /*
  * Copyright (C) 2007 Davide Libenzi <davidel@xmailserver.org>
  * Copyright (C) 2015,2022 Red Hat, Inc.
+ * Copyright (c) Linux Test Project, 2025
  *
  * Mostly copied/adapted from <linux/userfaultfd.h>
  */
@@ -9,6 +10,7 @@
 #ifndef LAPI_USERFAULTFD_H__
 #define LAPI_USERFAULTFD_H__
 
+#include <stdbool.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include "lapi/syscalls.h"
@@ -187,4 +189,35 @@ struct uffdio_continue {
 #define UFFD_FEATURE_MINOR_SHMEM		(1<<10)
 #endif /* UFFD_FEATURE_MINOR_SHMEM */
 
+#define SAFE_USERFAULTFD(flags, retry) \
+	safe_userfaultfd(__FILE__, __LINE__, (flags), (retry))
+
+static inline int safe_userfaultfd(const char *file, const int lineno, int
+				   flags, bool retry)
+{
+	int ret;
+
+retry:
+	ret = tst_syscall(__NR_userfaultfd, flags);
+	if (ret == -1) {
+		if (errno == EPERM) {
+			if (retry && !(flags & UFFD_USER_MODE_ONLY)) {
+				flags |= UFFD_USER_MODE_ONLY;
+				goto retry;
+			}
+			tst_res_(file, lineno, TINFO,
+				 "Hint: check /proc/sys/vm/unprivileged_userfaultfd");
+			tst_brk_(file, lineno, TCONF | TERRNO,
+				"userfaultfd() requires CAP_SYS_PTRACE on this system");
+		}
+		tst_brk_(file, lineno, TBROK | TERRNO,
+				 "syscall(__NR_userfaultfd, %d) failed", flags);
+	} else if (ret < 0) {
+		tst_brk_(file, lineno, TBROK | TERRNO,
+			 "Invalid syscall(__NR_userfaultfd, %d) return value %d", flags, ret);
+	}
+
+	return ret;
+}
+
 #endif /* LAPI_USERFAULTFD_H__ */
diff --git a/testcases/kernel/security/dirtyc0w_shmem/dirtyc0w_shmem_child.c b/testcases/kernel/security/dirtyc0w_shmem/dirtyc0w_shmem_child.c
index 2a982347c5..9c60fbfa34 100644
--- a/testcases/kernel/security/dirtyc0w_shmem/dirtyc0w_shmem_child.c
+++ b/testcases/kernel/security/dirtyc0w_shmem/dirtyc0w_shmem_child.c
@@ -128,21 +128,8 @@ static void setup_uffd(void)
 {
 	struct uffdio_register uffdio_register;
 	struct uffdio_api uffdio_api;
-	int flags = O_CLOEXEC | O_NONBLOCK;
 
-retry:
-	TEST(tst_syscall(__NR_userfaultfd, flags));
-	if (TST_RET < 0) {
-		if (TST_ERR == EPERM) {
-			if (!(flags & UFFD_USER_MODE_ONLY)) {
-				flags |= UFFD_USER_MODE_ONLY;
-				goto retry;
-			}
-		}
-		tst_brk(TBROK | TTERRNO,
-			"Could not create userfault file descriptor");
-	}
-	uffd = TST_RET;
+	uffd = SAFE_USERFAULTFD(O_CLOEXEC | O_NONBLOCK, true);
 
 	uffdio_api.api = UFFD_API;
 	uffdio_api.features = UFFD_FEATURE_MINOR_SHMEM;
diff --git a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
index c2c684d2b8..5a973ad8e9 100644
--- a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
+++ b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
@@ -23,11 +23,6 @@ static char *page;
 static void *copy_page;
 static int uffd;
 
-static int sys_userfaultfd(int flags)
-{
-	return tst_syscall(__NR_userfaultfd, flags);
-}
-
 static void set_pages(void)
 {
 	page_size = sysconf(_SC_PAGE_SIZE);
@@ -80,19 +75,8 @@ static void run(void)
 
 	set_pages();
 
-	TEST(sys_userfaultfd(O_CLOEXEC | O_NONBLOCK));
-
-	if (TST_RET == -1) {
-		if (TST_ERR == EPERM) {
-			tst_res(TCONF, "Hint: check /proc/sys/vm/unprivileged_userfaultfd");
-			tst_brk(TCONF | TTERRNO,
-				"userfaultfd() requires CAP_SYS_PTRACE on this system");
-		} else
-			tst_brk(TBROK | TTERRNO,
-				"Could not create userfault file descriptor");
-	}
+	uffd = SAFE_USERFAULTFD(O_CLOEXEC | O_NONBLOCK, false);
 
-	uffd = TST_RET;
 	uffdio_api.api = UFFD_API;
 	uffdio_api.features = 0;
 	SAFE_IOCTL(uffd, UFFDIO_API, &uffdio_api);
-- 
2.51.0
    
    
More information about the ltp
mailing list