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