summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorChristian Brauner <christian.brauner@ubuntu.com>2019-11-18 08:49:44 +0100
committerChristian Brauner <christian.brauner@ubuntu.com>2019-11-18 08:59:03 +0100
commit11fde161ab37f2938504bf896b48afbd18ea71cd (patch)
treea6469cc26af328bb9df220ec19732d1332d1390b /tools
parenta019ff3b8b10d1b7f5cd37edb9f4fbef3e031edf (diff)
selftests/clone3: skip if clone3() is ENOSYS
If the clone3() syscall is not implemented we should skip the tests. Fixes: 41585bbeeef9 ("selftests: add tests for clone3() with *set_tid") Fixes: 17a810699c18 ("selftests: add tests for clone3()") Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/testing/selftests/clone3/clone3.c1
-rw-r--r--tools/testing/selftests/clone3/clone3_clear_sighand.c29
-rw-r--r--tools/testing/selftests/clone3/clone3_selftests.h26
-rw-r--r--tools/testing/selftests/clone3/clone3_set_tid.c7
4 files changed, 33 insertions, 30 deletions
diff --git a/tools/testing/selftests/clone3/clone3.c b/tools/testing/selftests/clone3/clone3.c
index 4669b3d418e7..f14c269a5a18 100644
--- a/tools/testing/selftests/clone3/clone3.c
+++ b/tools/testing/selftests/clone3/clone3.c
@@ -131,6 +131,7 @@ int main(int argc, char *argv[])
uid_t uid = getuid();
+ test_clone3_supported();
ksft_print_header();
ksft_set_plan(17);
diff --git a/tools/testing/selftests/clone3/clone3_clear_sighand.c b/tools/testing/selftests/clone3/clone3_clear_sighand.c
index 456783ad19d6..9e1af8aa7698 100644
--- a/tools/testing/selftests/clone3/clone3_clear_sighand.c
+++ b/tools/testing/selftests/clone3/clone3_clear_sighand.c
@@ -20,32 +20,6 @@
#define CLONE_CLEAR_SIGHAND 0x100000000ULL
#endif
-static void test_clone3_supported(void)
-{
- pid_t pid;
- struct clone_args args = {};
-
- if (__NR_clone3 < 0)
- ksft_exit_skip("clone3() syscall is not supported\n");
-
- /* Set to something that will always cause EINVAL. */
- args.exit_signal = -1;
- pid = sys_clone3(&args, sizeof(args));
- if (!pid)
- exit(EXIT_SUCCESS);
-
- if (pid > 0) {
- wait(NULL);
- ksft_exit_fail_msg(
- "Managed to create child process with invalid exit_signal\n");
- }
-
- if (errno == ENOSYS)
- ksft_exit_skip("clone3() syscall is not supported\n");
-
- ksft_print_msg("clone3() syscall supported\n");
-}
-
static void nop_handler(int signo)
{
}
@@ -145,9 +119,10 @@ static void test_clone3_clear_sighand(void)
int main(int argc, char **argv)
{
ksft_print_header();
+ test_clone3_supported();
+
ksft_set_plan(1);
- test_clone3_supported();
test_clone3_clear_sighand();
return ksft_exit_pass();
diff --git a/tools/testing/selftests/clone3/clone3_selftests.h b/tools/testing/selftests/clone3/clone3_selftests.h
index 0e3dea58855f..a3f2c8ad8bcc 100644
--- a/tools/testing/selftests/clone3/clone3_selftests.h
+++ b/tools/testing/selftests/clone3/clone3_selftests.h
@@ -34,4 +34,30 @@ static pid_t sys_clone3(struct clone_args *args, size_t size)
return syscall(__NR_clone3, args, size);
}
+static inline void test_clone3_supported(void)
+{
+ pid_t pid;
+ struct clone_args args = {};
+
+ if (__NR_clone3 < 0)
+ ksft_exit_skip("clone3() syscall is not supported\n");
+
+ /* Set to something that will always cause EINVAL. */
+ args.exit_signal = -1;
+ pid = sys_clone3(&args, sizeof(args));
+ if (!pid)
+ exit(EXIT_SUCCESS);
+
+ if (pid > 0) {
+ wait(NULL);
+ ksft_exit_fail_msg(
+ "Managed to create child process with invalid exit_signal\n");
+ }
+
+ if (errno == ENOSYS)
+ ksft_exit_skip("clone3() syscall is not supported\n");
+
+ ksft_print_msg("clone3() syscall supported\n");
+}
+
#endif /* _CLONE3_SELFTESTS_H */
diff --git a/tools/testing/selftests/clone3/clone3_set_tid.c b/tools/testing/selftests/clone3/clone3_set_tid.c
index c6309f5d7d88..25beb22f35b5 100644
--- a/tools/testing/selftests/clone3/clone3_set_tid.c
+++ b/tools/testing/selftests/clone3/clone3_set_tid.c
@@ -156,12 +156,13 @@ int main(int argc, char *argv[])
pid_t pid, ns1, ns2, ns3, ns_pid;
pid_t set_tid[MAX_PID_NS_LEVEL * 2];
- if (pipe(pipe_1) < 0 || pipe(pipe_2) < 0)
- ksft_exit_fail_msg("pipe() failed\n");
-
ksft_print_header();
+ test_clone3_supported();
ksft_set_plan(29);
+ if (pipe(pipe_1) < 0 || pipe(pipe_2) < 0)
+ ksft_exit_fail_msg("pipe() failed\n");
+
f = fopen("/proc/sys/kernel/pid_max", "r");
if (f == NULL)
ksft_exit_fail_msg(