• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1From 0868889b82ca072a17d449f66d78ea1196b66e32 Mon Sep 17 00:00:00 2001
2From: Edward Liaw <edliaw@google.com>
3Date: Wed, 27 Apr 2022 22:17:23 +0000
4Subject: [PATCH 18/24] futex: skip when syscalls unavailable
5
6Skip tests when required syscall is not present
7
8Bug: 189333904
9Test: atest vts_linux_kselftest_x86_64:futex_functional_run.sh_x86_64
10Signed-off-by: Edward Liaw <edliaw@google.com>
11---
12 android/kselftest_test_list.mk                       |  5 ++++-
13 .../testing/selftests/futex/functional/futex_wait.c  |  2 ++
14 .../selftests/futex/functional/futex_wait_timeout.c  |  6 +++---
15 .../futex/functional/futex_wait_wouldblock.c         | 12 ++++++++----
16 .../testing/selftests/futex/functional/futex_waitv.c |  5 +++++
17 tools/testing/selftests/futex/functional/run.sh      |  4 +++-
18 6 files changed, 25 insertions(+), 9 deletions(-)
19
20diff --git a/android/kselftest_test_list.mk b/android/kselftest_test_list.mk
21index 46b9b92c58fba..fcd3b393e6f81 100644
22--- a/android/kselftest_test_list.mk
23+++ b/android/kselftest_test_list.mk
24@@ -21,13 +21,16 @@ kselftest_modules += \
25   kselftest_efivarfs_tests_create-read \
26   kselftest_efivarfs_tests_open-unlink \
27   kselftest_exec_test_execveat \
28-  kselftest_futex_tests_futex_requeue_pi \
29   kselftest_futex_tests_futex_requeue_pi_mismatched_ops \
30   kselftest_futex_tests_futex_requeue_pi_signal_restart \
31+  kselftest_futex_tests_futex_requeue_pi \
32+  kselftest_futex_tests_futex_requeue \
33   kselftest_futex_tests_futex_wait_private_mapped_file \
34   kselftest_futex_tests_futex_wait_timeout \
35   kselftest_futex_tests_futex_wait_uninitialized_heap \
36   kselftest_futex_tests_futex_wait_wouldblock \
37+  kselftest_futex_tests_futex_wait \
38+  kselftest_futex_tests_futex_waitv \
39   kselftest_intel_pstate_tests_aperf \
40   kselftest_intel_pstate_tests_msr \
41   kselftest_kcmp_tests_kcmp_test \
42diff --git a/tools/testing/selftests/futex/functional/futex_wait.c b/tools/testing/selftests/futex/functional/futex_wait.c
43index 685140d9b93d2..9bf695431e7aa 100644
44--- a/tools/testing/selftests/futex/functional/futex_wait.c
45+++ b/tools/testing/selftests/futex/functional/futex_wait.c
46@@ -96,6 +96,8 @@ int main(int argc, char *argv[])
47 	/* Testing an anon page shared memory */
48 	shm_id = shmget(IPC_PRIVATE, 4096, IPC_CREAT | 0666);
49 	if (shm_id < 0) {
50+		if (errno == ENOSYS)
51+			exit(KSFT_SKIP);
52 		perror("shmget");
53 		exit(1);
54 	}
55diff --git a/tools/testing/selftests/futex/functional/futex_wait_timeout.c b/tools/testing/selftests/futex/functional/futex_wait_timeout.c
56index 3651ce17beeb9..831f876a7b691 100644
57--- a/tools/testing/selftests/futex/functional/futex_wait_timeout.c
58+++ b/tools/testing/selftests/futex/functional/futex_wait_timeout.c
59@@ -60,7 +60,7 @@ void *get_pi_lock(void *arg)
60  */
61 static void test_timeout(int res, int *ret, char *test_name, int err)
62 {
63-	if (!res || errno != err) {
64+	if (!res || !(errno & err)) {
65 		ksft_test_result_fail("%s returned %d\n", test_name,
66 				      res < 0 ? errno : res);
67 		*ret = RET_FAIL;
68@@ -186,13 +186,13 @@ int main(int argc, char *argv[])
69 	if (futex_get_abs_timeout(CLOCK_MONOTONIC, &to, timeout_ns))
70 		return RET_FAIL;
71 	res = futex_waitv(&waitv, 1, 0, &to, CLOCK_MONOTONIC);
72-	test_timeout(res, &ret, "futex_waitv monotonic", ETIMEDOUT);
73+	test_timeout(res, &ret, "futex_waitv monotonic", ETIMEDOUT | ENOSYS);
74
75 	/* futex_waitv with CLOCK_REALTIME */
76 	if (futex_get_abs_timeout(CLOCK_REALTIME, &to, timeout_ns))
77 		return RET_FAIL;
78 	res = futex_waitv(&waitv, 1, 0, &to, CLOCK_REALTIME);
79-	test_timeout(res, &ret, "futex_waitv realtime", ETIMEDOUT);
80+	test_timeout(res, &ret, "futex_waitv realtime", ETIMEDOUT | ENOSYS);
81
82 	ksft_print_cnts();
83 	return ret;
84diff --git a/tools/testing/selftests/futex/functional/futex_wait_wouldblock.c b/tools/testing/selftests/futex/functional/futex_wait_wouldblock.c
85index 7d7a6a06cdb75..0a67934590f04 100644
86--- a/tools/testing/selftests/futex/functional/futex_wait_wouldblock.c
87+++ b/tools/testing/selftests/futex/functional/futex_wait_wouldblock.c
88@@ -98,10 +98,14 @@ int main(int argc, char *argv[])
89 	info("Calling futex_waitv on f1: %u @ %p with val=%u\n", f1, &f1, f1+1);
90 	res = futex_waitv(&waitv, 1, 0, &to, CLOCK_MONOTONIC);
91 	if (!res || errno != EWOULDBLOCK) {
92-		ksft_test_result_pass("futex_waitv returned: %d %s\n",
93-				      res ? errno : res,
94-				      res ? strerror(errno) : "");
95-		ret = RET_FAIL;
96+		if (errno == ENOSYS)
97+			ksft_test_result_skip("futex_waitv syscall not available in this kernel\n");
98+		else {
99+			ksft_test_result_fail("futex_waitv returned: %d %s\n",
100+								res ? errno : res,
101+								res ? strerror(errno) : "");
102+			ret = RET_FAIL;
103+		}
104 	} else {
105 		ksft_test_result_pass("futex_waitv\n");
106 	}
107diff --git a/tools/testing/selftests/futex/functional/futex_waitv.c b/tools/testing/selftests/futex/functional/futex_waitv.c
108index a94337f677e18..aafc6a4f25b5d 100644
109--- a/tools/testing/selftests/futex/functional/futex_waitv.c
110+++ b/tools/testing/selftests/futex/functional/futex_waitv.c
111@@ -47,6 +47,11 @@ void *waiterfn(void *arg)
112
113 	res = futex_waitv(waitv, NR_FUTEXES, 0, &to, CLOCK_MONOTONIC);
114 	if (res < 0) {
115+		if (errno == ENOSYS) {
116+			ksft_test_result_skip("futex_waitv syscall not available in this kernel\n");
117+			ksft_print_cnts();
118+			exit(KSFT_SKIP);
119+		}
120 		ksft_test_result_fail("futex_waitv returned: %d %s\n",
121 				      errno, strerror(errno));
122 	} else if (res != NR_FUTEXES - 1) {
123diff --git a/tools/testing/selftests/futex/functional/run.sh b/tools/testing/selftests/futex/functional/run.sh
124index 6eb4a8dd86757..9b2dbb88c5f1e 100755
125--- a/tools/testing/selftests/futex/functional/run.sh
126+++ b/tools/testing/selftests/futex/functional/run.sh
127@@ -21,7 +21,9 @@
128 run_test()
129 {
130 	$@
131-	if [ $? -ne 0 ]; then
132+    ret=$?
133+	if [ $ret -ne 0 ] && [ $ret -ne 4 ]; then  # KSFT_SKIP=4
134+        echo "Failed with $ret"
135 		rc=1
136 	fi
137 }
138--
1392.36.0.550.gb090851708-goog
140
141