[LTP] [PATCH v2 2/2] syscalls/pidfd_open04: Add new test with PIDFD_NONBLOCK flag
Yang Xu
xuyang2018.jy@fujitsu.com
Thu Feb 10 04:41:17 CET 2022
As pidfd_open man-page said
"PIDFD_NONBLOCK (since Linux 5.10)
Return a nonblocking file descriptor. If the process referred to by
the file descriptor has not yet terminated, then an attempt to wait
on the file descriptor using waitid(2) will immediately return
the error EAGAIN rather than blocking."
Test this and also test whether set NONBLOCK flag in its pidfd.
Noticed that, don't introduce lapi/pidfd.h because linux/pidfd.h uses
kernel header fcntl.h but ltp api uses libc header. so it may
exist redefinition error of 'struct flock'[1].
[1]https://github.com/golang/go/issues/48221
Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com>
---
runtest/syscalls | 1 +
.../kernel/syscalls/pidfd_open/.gitignore | 1 +
.../kernel/syscalls/pidfd_open/pidfd_open04.c | 90 +++++++++++++++++++
3 files changed, 92 insertions(+)
create mode 100644 testcases/kernel/syscalls/pidfd_open/pidfd_open04.c
diff --git a/runtest/syscalls b/runtest/syscalls
index c3e037f72..ce6f89f88 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -954,6 +954,7 @@ personality02 personality02
pidfd_open01 pidfd_open01
pidfd_open02 pidfd_open02
pidfd_open03 pidfd_open03
+pidfd_open04 pidfd_open04
pidfd_send_signal01 pidfd_send_signal01
pidfd_send_signal02 pidfd_send_signal02
diff --git a/testcases/kernel/syscalls/pidfd_open/.gitignore b/testcases/kernel/syscalls/pidfd_open/.gitignore
index e0b8900c1..cebdc624d 100644
--- a/testcases/kernel/syscalls/pidfd_open/.gitignore
+++ b/testcases/kernel/syscalls/pidfd_open/.gitignore
@@ -1,3 +1,4 @@
pidfd_open01
pidfd_open02
pidfd_open03
+pidfd_open04
diff --git a/testcases/kernel/syscalls/pidfd_open/pidfd_open04.c b/testcases/kernel/syscalls/pidfd_open/pidfd_open04.c
new file mode 100644
index 000000000..91c7f26e1
--- /dev/null
+++ b/testcases/kernel/syscalls/pidfd_open/pidfd_open04.c
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2022 FUJITSU LIMITED. All rights reserved.
+ * Author: Yang Xu <xuyang2018.jy@fujitsu.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * Verify that the PIDFD_NONBLOCK flag works with pidfd_open() and
+ * that waitid() with a non-blocking pidfd returns EAGAIN.
+ */
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/wait.h>
+#include <stdlib.h>
+#include "tst_test.h"
+#include "lapi/pidfd_open.h"
+
+#ifndef PIDFD_NONBLOCK
+#define PIDFD_NONBLOCK O_NONBLOCK
+#endif
+
+#ifndef P_PIDFD
+#define P_PIDFD 3
+#endif
+
+static void run(void)
+{
+ int flag, pid, pidfd, ret;
+ siginfo_t info;
+
+ pid = SAFE_FORK();
+ if (!pid) {
+ TST_CHECKPOINT_WAIT(0);
+ exit(EXIT_SUCCESS);
+ }
+
+ TST_EXP_FD_SILENT(pidfd_open(pid, PIDFD_NONBLOCK),
+ "pidfd_open(%d, PIDFD_NONBLOCK)", pid);
+
+ pidfd = TST_RET;
+ flag = fcntl(pidfd, F_GETFL);
+ if (flag == -1)
+ tst_brk(TFAIL | TERRNO, "fcntl(F_GETFL) failed");
+
+ if (!(flag & O_NONBLOCK))
+ tst_brk(TFAIL, "pidfd_open(%d, O_NONBLOCK) didn't set O_NONBLOCK flag", pid);
+
+ tst_res(TPASS, "pidfd_open(%d, O_NONBLOCK) sets O_NONBLOCK flag", pid);
+
+ TST_EXP_FAIL(waitid(P_PIDFD, pidfd, &info, WEXITED), EAGAIN,
+ "waitid(P_PIDFD,...,WEXITED)");
+
+ TST_CHECKPOINT_WAKE(0);
+
+ ret = TST_RETRY_FUNC(waitid(P_PIDFD, pidfd, &info, WEXITED), TST_RETVAL_EQ0);
+ if (ret == 0) {
+ tst_res(TPASS, "waitid(P_PIDFD) succeeded after child process terminated");
+ } else {
+ tst_res(TFAIL, "waitid(P_PIDFD) failed after child process terminated");
+ SAFE_WAIT(NULL);
+ }
+
+ SAFE_CLOSE(pidfd);
+}
+
+static void setup(void)
+{
+ pidfd_open_supported();
+
+ TEST(pidfd_open(getpid(), PIDFD_NONBLOCK));
+ if (TST_RET == -1) {
+ if (TST_ERR == EINVAL) {
+ tst_brk(TCONF, "PIDFD_NONBLOCK was supported since linux 5.10");
+ return;
+ }
+ tst_brk(TFAIL | TTERRNO,
+ "pidfd_open(getpid(),PIDFD_NONBLOCK) failed unexpectedly");
+ }
+}
+
+static struct tst_test test = {
+ .needs_root = 1,
+ .forks_child = 1,
+ .needs_checkpoints = 1,
+ .setup = setup,
+ .test_all = run,
+};
--
2.23.0
More information about the ltp
mailing list