[LTP] [PATCH 1/2] epoll_pwait: Refactor timeout to struct timespec

Martin Doucha mdoucha@suse.cz
Tue Jun 3 16:13:16 CEST 2025


Support higher precision timeout in do_epoll_pwait() by passing struct
timespec instead of int value in milliseconds. Only one test actually
uses the parameter.

Signed-off-by: Martin Doucha <mdoucha@suse.cz>
---
 .../syscalls/epoll_pwait/epoll_pwait01.c      |  4 ++--
 .../syscalls/epoll_pwait/epoll_pwait02.c      |  2 +-
 .../syscalls/epoll_pwait/epoll_pwait03.c      |  9 +++++---
 .../syscalls/epoll_pwait/epoll_pwait04.c      |  2 +-
 .../syscalls/epoll_pwait/epoll_pwait_var.h    | 22 +++++++++----------
 5 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/testcases/kernel/syscalls/epoll_pwait/epoll_pwait01.c b/testcases/kernel/syscalls/epoll_pwait/epoll_pwait01.c
index 954e77314..012ba1562 100644
--- a/testcases/kernel/syscalls/epoll_pwait/epoll_pwait01.c
+++ b/testcases/kernel/syscalls/epoll_pwait/epoll_pwait01.c
@@ -30,7 +30,7 @@ static void sighandler(int sig LTP_ATTRIBUTE_UNUSED) {}
 
 static void verify_sigmask(void)
 {
-	TEST(do_epoll_pwait(efd, &e, 1, -1, &signalset));
+	TEST(do_epoll_pwait(efd, &e, 1, NULL, &signalset));
 
 	if (TST_RET != 1) {
 		tst_res(TFAIL, "do_epoll_pwait() returned %li, expected 1",
@@ -43,7 +43,7 @@ static void verify_sigmask(void)
 
 static void verify_nonsigmask(void)
 {
-	TST_EXP_FAIL(do_epoll_pwait(efd, &e, 1, -1, NULL), EINTR,
+	TST_EXP_FAIL(do_epoll_pwait(efd, &e, 1, NULL, NULL), EINTR,
 		     "do_epoll_pwait() without sigmask");
 }
 
diff --git a/testcases/kernel/syscalls/epoll_pwait/epoll_pwait02.c b/testcases/kernel/syscalls/epoll_pwait/epoll_pwait02.c
index 069620c5d..a27c7db9e 100644
--- a/testcases/kernel/syscalls/epoll_pwait/epoll_pwait02.c
+++ b/testcases/kernel/syscalls/epoll_pwait/epoll_pwait02.c
@@ -19,7 +19,7 @@ static struct epoll_event e;
 
 static void run(void)
 {
-	TEST(do_epoll_pwait(efd, &e, 1, -1, NULL));
+	TEST(do_epoll_pwait(efd, &e, 1, NULL, NULL));
 
 	if (TST_RET == 1) {
 		tst_res(TPASS, "do_epoll_pwait() succeeded");
diff --git a/testcases/kernel/syscalls/epoll_pwait/epoll_pwait03.c b/testcases/kernel/syscalls/epoll_pwait/epoll_pwait03.c
index 8217f9f80..572d347f1 100644
--- a/testcases/kernel/syscalls/epoll_pwait/epoll_pwait03.c
+++ b/testcases/kernel/syscalls/epoll_pwait/epoll_pwait03.c
@@ -13,17 +13,20 @@
 #include "tst_timer_test.h"
 #include "epoll_pwait_var.h"
 
-#define USEC_PER_MSEC (1000L)
+#define USEC_PER_NSEC (1000L)
+#define USEC_PER_SEC (1000000L)
 
 static int efd, sfd[2];
 static struct epoll_event e;
 
 int sample_fn(int clk_id, long long usec)
 {
-	unsigned int ms = usec / USEC_PER_MSEC;
+	struct timespec ts;
 
+	ts.tv_sec = usec / USEC_PER_SEC;
+	ts.tv_nsec = (usec % USEC_PER_SEC) * USEC_PER_NSEC;
 	tst_timer_start(clk_id);
-	TEST(do_epoll_pwait(efd, &e, 1, ms, NULL));
+	TEST(do_epoll_pwait(efd, &e, 1, &ts, NULL));
 	tst_timer_stop();
 	tst_timer_sample();
 
diff --git a/testcases/kernel/syscalls/epoll_pwait/epoll_pwait04.c b/testcases/kernel/syscalls/epoll_pwait/epoll_pwait04.c
index cc1d04e6b..b399225b9 100644
--- a/testcases/kernel/syscalls/epoll_pwait/epoll_pwait04.c
+++ b/testcases/kernel/syscalls/epoll_pwait/epoll_pwait04.c
@@ -20,7 +20,7 @@ static void *bad_addr;
 
 static void run(void)
 {
-	TST_EXP_FAIL(do_epoll_pwait(efd, &e, 1, -1, bad_addr),
+	TST_EXP_FAIL(do_epoll_pwait(efd, &e, 1, NULL, bad_addr),
 		     EFAULT, "with an invalid sigmask pointer");
 }
 
diff --git a/testcases/kernel/syscalls/epoll_pwait/epoll_pwait_var.h b/testcases/kernel/syscalls/epoll_pwait/epoll_pwait_var.h
index 58a3f15a2..454e80a87 100644
--- a/testcases/kernel/syscalls/epoll_pwait/epoll_pwait_var.h
+++ b/testcases/kernel/syscalls/epoll_pwait/epoll_pwait_var.h
@@ -14,22 +14,22 @@
 #define NSEC_PER_MSEC (1000000L)
 
 static int do_epoll_pwait(int epfd, struct epoll_event *events, int
-	maxevents, int timeout, const sigset_t *sigmask)
+	maxevents, struct timespec *timeout, const sigset_t *sigmask)
 {
-	if (tst_variant == 0)
-		return epoll_pwait(epfd, events, maxevents, timeout, sigmask);
+	if (tst_variant == 0) {
+		int timeout_ms = -1;
 
-	struct timespec ts;
+		if (timeout) {
+			timeout_ms = timeout->tv_sec * MSEC_PER_SEC;
+			timeout_ms += (timeout->tv_nsec + NSEC_PER_MSEC - 1) /
+				NSEC_PER_MSEC;
+		}
 
-	if (timeout < 0) {
-		return epoll_pwait2(epfd, events, maxevents, NULL, sigmask);
-	} else {
-		ts.tv_sec = timeout / MSEC_PER_SEC;
-		ts.tv_nsec = NSEC_PER_MSEC * (timeout % MSEC_PER_SEC);
+		return epoll_pwait(epfd, events, maxevents, timeout_ms,
+			sigmask);
 	}
 
-	return epoll_pwait2(epfd, events, maxevents, &ts, sigmask);
-
+	return epoll_pwait2(epfd, events, maxevents, timeout, sigmask);
 }
 
 static void epoll_pwait_init(void)
-- 
2.49.0



More information about the ltp mailing list