[LTP] [PATCH v4] userfaultfd: Minor fixes
Ricardo Branco
rbranco@suse.de
Tue May 5 15:14:41 CEST 2026
- Use POSIX semantics for thread function
- Set cleanup to call reset_pages
- Use long for page_size and use unsigned cast
- Call the SAFE_ versions of some system calls
- Use TFAIL consistently for unexpected UFFD_EVENTs
Signed-off-by: Ricardo Branco <rbranco@suse.de>
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Reviewed-by: Andrea Cervesato <andrea.cervesato@suse.com>
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
---
.../syscalls/userfaultfd/userfaultfd01.c | 27 +++++++++++------
.../syscalls/userfaultfd/userfaultfd02.c | 27 +++++++++++------
.../syscalls/userfaultfd/userfaultfd03.c | 29 ++++++++++++-------
.../syscalls/userfaultfd/userfaultfd04.c | 22 +++++++++-----
.../syscalls/userfaultfd/userfaultfd05.c | 22 +++++++++-----
.../syscalls/userfaultfd/userfaultfd06.c | 14 +++++----
6 files changed, 91 insertions(+), 50 deletions(-)
diff --git a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
index 7368d3863..3af0e8240 100644
--- a/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
+++ b/testcases/kernel/syscalls/userfaultfd/userfaultfd01.c
@@ -28,10 +28,10 @@ static struct tcase {
{ DESC(O_CLOEXEC | O_NONBLOCK | UFFD_USER_MODE_ONLY), .kver = AFTER_5_11, },
};
-static int page_size;
+static long page_size;
static char *page;
static void *copy_page;
-static int uffd;
+static int uffd = -1;
static int kver;
static void setup(void)
@@ -44,7 +44,7 @@ static void setup(void)
static void set_pages(void)
{
- page_size = sysconf(_SC_PAGE_SIZE);
+ page_size = SAFE_SYSCONF(_SC_PAGE_SIZE);
page = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
copy_page = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE,
@@ -53,11 +53,19 @@ static void set_pages(void)
static void reset_pages(void)
{
- SAFE_MUNMAP(page, page_size);
- SAFE_MUNMAP(copy_page, page_size);
+ if (page) {
+ SAFE_MUNMAP(page, page_size);
+ page = NULL;
+ }
+ if (copy_page) {
+ SAFE_MUNMAP(copy_page, page_size);
+ copy_page = NULL;
+ }
+ if (uffd != -1)
+ SAFE_CLOSE(uffd);
}
-static void *handle_thread(void)
+static void *handle_thread(void *arg LTP_ATTRIBUTE_UNUSED)
{
static struct uffd_msg msg;
struct uffdio_copy uffdio_copy = {};
@@ -74,18 +82,18 @@ static void *handle_thread(void)
SAFE_READ(1, uffd, &msg, sizeof(msg));
if (msg.event != UFFD_EVENT_PAGEFAULT)
- tst_brk(TBROK | TERRNO, "Received unexpected UFFD_EVENT %d", msg.event);
+ tst_brk(TFAIL, "Received unexpected UFFD_EVENT %d", msg.event);
memset(copy_page, 'X', page_size);
uffdio_copy.src = (unsigned long) copy_page;
uffdio_copy.dst = (unsigned long) msg.arg.pagefault.address
- & ~(page_size - 1);
+ & ~((unsigned long)page_size - 1);
uffdio_copy.len = page_size;
SAFE_IOCTL(uffd, UFFDIO_COPY, &uffdio_copy);
- close(uffd);
+ SAFE_CLOSE(uffd);
return NULL;
}
@@ -129,4 +137,5 @@ static struct tst_test test = {
.setup = setup,
.test = run,
.tcnt = ARRAY_SIZE(tcases),
+ .cleanup = reset_pages,
};
diff --git a/testcases/kernel/syscalls/userfaultfd/userfaultfd02.c b/testcases/kernel/syscalls/userfaultfd/userfaultfd02.c
index 2fd5ba5d8..70dd844b3 100644
--- a/testcases/kernel/syscalls/userfaultfd/userfaultfd02.c
+++ b/testcases/kernel/syscalls/userfaultfd/userfaultfd02.c
@@ -16,14 +16,14 @@
#include "tst_safe_pthread.h"
#include "lapi/userfaultfd.h"
-static int page_size;
+static long page_size;
static char *page;
static void *move_page;
-static int uffd;
+static int uffd = -1;
static void set_pages(void)
{
- page_size = sysconf(_SC_PAGE_SIZE);
+ page_size = SAFE_SYSCONF(_SC_PAGE_SIZE);
page = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
move_page = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE,
@@ -32,11 +32,19 @@ static void set_pages(void)
static void reset_pages(void)
{
- SAFE_MUNMAP(page, page_size);
- SAFE_MUNMAP(move_page, page_size);
+ if (page) {
+ SAFE_MUNMAP(page, page_size);
+ page = NULL;
+ }
+ if (move_page) {
+ SAFE_MUNMAP(move_page, page_size);
+ move_page = NULL;
+ }
+ if (uffd != -1)
+ SAFE_CLOSE(uffd);
}
-static void *handle_thread(void)
+static void *handle_thread(void *arg LTP_ATTRIBUTE_UNUSED)
{
static struct uffd_msg msg;
struct uffdio_move uffdio_move = {};
@@ -44,18 +52,18 @@ static void *handle_thread(void)
SAFE_READ(1, uffd, &msg, sizeof(msg));
if (msg.event != UFFD_EVENT_PAGEFAULT)
- tst_brk(TBROK | TERRNO, "Received unexpected UFFD_EVENT %d", msg.event);
+ tst_brk(TFAIL, "Received unexpected UFFD_EVENT %d", msg.event);
memset(move_page, 'X', page_size);
uffdio_move.src = (unsigned long) move_page;
uffdio_move.dst = (unsigned long) msg.arg.pagefault.address
- & ~(page_size - 1);
+ & ~((unsigned long)page_size - 1);
uffdio_move.len = page_size;
SAFE_IOCTL(uffd, UFFDIO_MOVE, &uffdio_move);
- close(uffd);
+ SAFE_CLOSE(uffd);
return NULL;
}
@@ -94,4 +102,5 @@ static void run(void)
static struct tst_test test = {
.test_all = run,
.min_kver = "6.8",
+ .cleanup = reset_pages,
};
diff --git a/testcases/kernel/syscalls/userfaultfd/userfaultfd03.c b/testcases/kernel/syscalls/userfaultfd/userfaultfd03.c
index b65f39eca..8a720e41a 100644
--- a/testcases/kernel/syscalls/userfaultfd/userfaultfd03.c
+++ b/testcases/kernel/syscalls/userfaultfd/userfaultfd03.c
@@ -19,10 +19,10 @@
#include "tst_safe_pthread.h"
#include "lapi/userfaultfd.h"
-static int page_size;
+static long page_size;
static char *page;
static void *copy_page;
-static int uffd;
+static int uffd = -1;
static void setup(void)
{
@@ -48,7 +48,7 @@ static int open_userfaultfd(int flags)
static void set_pages(void)
{
- page_size = sysconf(_SC_PAGE_SIZE);
+ page_size = SAFE_SYSCONF(_SC_PAGE_SIZE);
page = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
copy_page = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE,
@@ -57,11 +57,19 @@ static void set_pages(void)
static void reset_pages(void)
{
- SAFE_MUNMAP(page, page_size);
- SAFE_MUNMAP(copy_page, page_size);
+ if (page) {
+ SAFE_MUNMAP(page, page_size);
+ page = NULL;
+ }
+ if (copy_page) {
+ SAFE_MUNMAP(copy_page, page_size);
+ copy_page = NULL;
+ }
+ if (uffd != -1)
+ SAFE_CLOSE(uffd);
}
-static void *handle_thread(void)
+static void *handle_thread(void *arg LTP_ATTRIBUTE_UNUSED)
{
static struct uffd_msg msg;
struct uffdio_copy uffdio_copy = {};
@@ -78,18 +86,18 @@ static void *handle_thread(void)
SAFE_READ(1, uffd, &msg, sizeof(msg));
if (msg.event != UFFD_EVENT_PAGEFAULT)
- tst_brk(TBROK | TERRNO, "Received unexpected UFFD_EVENT %d", msg.event);
+ tst_brk(TFAIL, "Received unexpected UFFD_EVENT %d", msg.event);
memset(copy_page, 'X', page_size);
uffdio_copy.src = (unsigned long) copy_page;
uffdio_copy.dst = (unsigned long) msg.arg.pagefault.address
- & ~(page_size - 1);
+ & ~((unsigned long)page_size - 1);
uffdio_copy.len = page_size;
SAFE_IOCTL(uffd, UFFDIO_COPY, &uffdio_copy);
- close(uffd);
+ SAFE_CLOSE(uffd);
return NULL;
}
@@ -132,5 +140,6 @@ static struct tst_test test = {
.needs_kconfigs = (const char *[]) {
"CONFIG_USERFAULTFD=y",
NULL
- }
+ },
+ .cleanup = reset_pages,
};
diff --git a/testcases/kernel/syscalls/userfaultfd/userfaultfd04.c b/testcases/kernel/syscalls/userfaultfd/userfaultfd04.c
index 4eb811e45..926812649 100644
--- a/testcases/kernel/syscalls/userfaultfd/userfaultfd04.c
+++ b/testcases/kernel/syscalls/userfaultfd/userfaultfd04.c
@@ -17,23 +17,28 @@
#include "tst_safe_pthread.h"
#include "lapi/userfaultfd.h"
-static int page_size;
+static long page_size;
static char *page;
-static int uffd;
+static int uffd = -1;
static void set_pages(void)
{
- page_size = sysconf(_SC_PAGE_SIZE);
+ page_size = SAFE_SYSCONF(_SC_PAGE_SIZE);
page = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
}
static void reset_pages(void)
{
- SAFE_MUNMAP(page, page_size);
+ if (page) {
+ SAFE_MUNMAP(page, page_size);
+ page = NULL;
+ }
+ if (uffd != -1)
+ SAFE_CLOSE(uffd);
}
-static void *handle_thread(void)
+static void *handle_thread(void *arg LTP_ATTRIBUTE_UNUSED)
{
static struct uffd_msg msg;
struct uffdio_zeropage uffdio_zeropage = {};
@@ -50,15 +55,15 @@ static void *handle_thread(void)
SAFE_READ(1, uffd, &msg, sizeof(msg));
if (msg.event != UFFD_EVENT_PAGEFAULT)
- tst_brk(TBROK | TERRNO, "Received unexpected UFFD_EVENT %d", msg.event);
+ tst_brk(TFAIL, "Received unexpected UFFD_EVENT %d", msg.event);
uffdio_zeropage.range.start = msg.arg.pagefault.address
- & ~(page_size - 1);
+ & ~((unsigned long)page_size - 1);
uffdio_zeropage.range.len = page_size;
SAFE_IOCTL(uffd, UFFDIO_ZEROPAGE, &uffdio_zeropage);
- close(uffd);
+ SAFE_CLOSE(uffd);
return NULL;
}
@@ -98,4 +103,5 @@ static void run(void)
static struct tst_test test = {
.test_all = run,
+ .cleanup = reset_pages,
};
diff --git a/testcases/kernel/syscalls/userfaultfd/userfaultfd05.c b/testcases/kernel/syscalls/userfaultfd/userfaultfd05.c
index e25a227cf..59956d85d 100644
--- a/testcases/kernel/syscalls/userfaultfd/userfaultfd05.c
+++ b/testcases/kernel/syscalls/userfaultfd/userfaultfd05.c
@@ -17,14 +17,14 @@
#include "tst_safe_pthread.h"
#include "lapi/userfaultfd.h"
-static int page_size;
+static long page_size;
static char *page;
-static int uffd;
+static int uffd = -1;
static volatile int wp_fault_seen;
static void set_pages(void)
{
- page_size = sysconf(_SC_PAGE_SIZE);
+ page_size = SAFE_SYSCONF(_SC_PAGE_SIZE);
page = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
@@ -33,10 +33,15 @@ static void set_pages(void)
static void reset_pages(void)
{
- SAFE_MUNMAP(page, page_size);
+ if (page) {
+ SAFE_MUNMAP(page, page_size);
+ page = NULL;
+ }
+ if (uffd != -1)
+ SAFE_CLOSE(uffd);
}
-static void *handle_thread(void)
+static void *handle_thread(void *arg LTP_ATTRIBUTE_UNUSED)
{
static struct uffd_msg msg;
struct uffdio_writeprotect uffdio_writeprotect = {};
@@ -70,12 +75,12 @@ static void *handle_thread(void)
wp_fault_seen = 1;
/* Resolve the fault by clearing WP so the writer can resume. */
- uffdio_writeprotect.range.start = msg.arg.pagefault.address & ~(page_size - 1);
+ uffdio_writeprotect.range.start = msg.arg.pagefault.address & ~((unsigned long)page_size - 1);
uffdio_writeprotect.range.len = page_size;
SAFE_IOCTL(uffd, UFFDIO_WRITEPROTECT, &uffdio_writeprotect);
- close(uffd);
+ SAFE_CLOSE(uffd);
return NULL;
}
@@ -127,5 +132,6 @@ static struct tst_test test = {
.needs_kconfigs = (const char *[]) {
"CONFIG_HAVE_ARCH_USERFAULTFD_WP=y",
NULL
- }
+ },
+ .cleanup = reset_pages,
};
diff --git a/testcases/kernel/syscalls/userfaultfd/userfaultfd06.c b/testcases/kernel/syscalls/userfaultfd/userfaultfd06.c
index 5b1252c35..ec93d8ad6 100644
--- a/testcases/kernel/syscalls/userfaultfd/userfaultfd06.c
+++ b/testcases/kernel/syscalls/userfaultfd/userfaultfd06.c
@@ -19,9 +19,9 @@
#include "tst_safe_pthread.h"
#include "lapi/userfaultfd.h"
-static int page_size;
+static long page_size;
static char *page;
-static int uffd;
+static int uffd = -1;
static int poison_fault_seen;
static volatile int sigbus_seen;
static sigjmp_buf jmpbuf;
@@ -45,7 +45,7 @@ static void setup(void)
static void set_pages(void)
{
- page_size = sysconf(_SC_PAGE_SIZE);
+ page_size = SAFE_SYSCONF(_SC_PAGE_SIZE);
page = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
}
@@ -56,9 +56,11 @@ static void reset_pages(void)
SAFE_MUNMAP(page, page_size);
page = NULL;
}
+ if (uffd != -1)
+ SAFE_CLOSE(uffd);
}
-static void *handle_thread(void)
+static void *handle_thread(void *arg LTP_ATTRIBUTE_UNUSED)
{
static struct uffd_msg msg;
struct uffdio_poison uffdio_poison = {};
@@ -79,12 +81,12 @@ static void *handle_thread(void)
tst_atomic_store(1, &poison_fault_seen);
/* Poison the page that triggered the fault */
- uffdio_poison.range.start = msg.arg.pagefault.address & ~(page_size - 1);
+ uffdio_poison.range.start = msg.arg.pagefault.address & ~((unsigned long)page_size - 1);
uffdio_poison.range.len = page_size;
SAFE_IOCTL(uffd, UFFDIO_POISON, &uffdio_poison);
- close(uffd);
+ SAFE_CLOSE(uffd);
return NULL;
}
--
2.54.0
More information about the ltp
mailing list