selftest/futex: Make the error check more precise for futex_numa_mpol
authorAndré Almeida <andrealmeid@igalia.com>
Mon, 15 Sep 2025 21:26:28 +0000 (23:26 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Wed, 17 Sep 2025 17:48:44 +0000 (19:48 +0200)
Instead of just checking if the syscall failed as expected, check as
well if the returned error code matches the expected error code.

[ bigeasy: reword the commmit message ]

Signed-off-by: André Almeida <andrealmeid@igalia.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Waiman Long <longman@redhat.com>
tools/testing/selftests/futex/functional/futex_numa_mpol.c

index 802c15c..dd7b05e 100644 (file)
@@ -77,7 +77,7 @@ static void join_max_threads(void)
        }
 }
 
-static void __test_futex(void *futex_ptr, int must_fail, unsigned int futex_flags)
+static void __test_futex(void *futex_ptr, int err_value, unsigned int futex_flags)
 {
        int to_wake, ret, i, need_exit = 0;
 
@@ -88,11 +88,17 @@ static void __test_futex(void *futex_ptr, int must_fail, unsigned int futex_flag
 
        do {
                ret = futex2_wake(futex_ptr, to_wake, futex_flags);
-               if (must_fail) {
-                       if (ret < 0)
-                               break;
-                       ksft_exit_fail_msg("futex2_wake(%d, 0x%x) should fail, but didn't\n",
-                                          to_wake, futex_flags);
+
+               if (err_value) {
+                       if (ret >= 0)
+                               ksft_exit_fail_msg("futex2_wake(%d, 0x%x) should fail, but didn't\n",
+                                                  to_wake, futex_flags);
+
+                       if (errno != err_value)
+                               ksft_exit_fail_msg("futex2_wake(%d, 0x%x) expected error was %d, but returned %d (%s)\n",
+                                                  to_wake, futex_flags, err_value, errno, strerror(errno));
+
+                       break;
                }
                if (ret < 0) {
                        ksft_exit_fail_msg("Failed futex2_wake(%d, 0x%x): %m\n",
@@ -106,12 +112,12 @@ static void __test_futex(void *futex_ptr, int must_fail, unsigned int futex_flag
        join_max_threads();
 
        for (i = 0; i < MAX_THREADS; i++) {
-               if (must_fail && thread_args[i].result != -1) {
+               if (err_value && thread_args[i].result != -1) {
                        ksft_print_msg("Thread %d should fail but succeeded (%d)\n",
                                       i, thread_args[i].result);
                        need_exit = 1;
                }
-               if (!must_fail && thread_args[i].result != 0) {
+               if (!err_value && thread_args[i].result != 0) {
                        ksft_print_msg("Thread %d failed (%d)\n", i, thread_args[i].result);
                        need_exit = 1;
                }
@@ -120,14 +126,14 @@ static void __test_futex(void *futex_ptr, int must_fail, unsigned int futex_flag
                ksft_exit_fail_msg("Aborting due to earlier errors.\n");
 }
 
-static void test_futex(void *futex_ptr, int must_fail)
+static void test_futex(void *futex_ptr, int err_value)
 {
-       __test_futex(futex_ptr, must_fail, FUTEX2_SIZE_U32 | FUTEX_PRIVATE_FLAG | FUTEX2_NUMA);
+       __test_futex(futex_ptr, err_value, FUTEX2_SIZE_U32 | FUTEX_PRIVATE_FLAG | FUTEX2_NUMA);
 }
 
-static void test_futex_mpol(void *futex_ptr, int must_fail)
+static void test_futex_mpol(void *futex_ptr, int err_value)
 {
-       __test_futex(futex_ptr, must_fail, FUTEX2_SIZE_U32 | FUTEX_PRIVATE_FLAG | FUTEX2_NUMA | FUTEX2_MPOL);
+       __test_futex(futex_ptr, err_value, FUTEX2_SIZE_U32 | FUTEX_PRIVATE_FLAG | FUTEX2_NUMA | FUTEX2_MPOL);
 }
 
 static void usage(char *prog)
@@ -184,16 +190,16 @@ int main(int argc, char *argv[])
 
        /* FUTEX2_NUMA futex must be 8-byte aligned */
        ksft_print_msg("Mis-aligned futex\n");
-       test_futex(futex_ptr + mem_size - 4, 1);
+       test_futex(futex_ptr + mem_size - 4, EINVAL);
 
        futex_numa->numa = FUTEX_NO_NODE;
        mprotect(futex_ptr, mem_size, PROT_READ);
        ksft_print_msg("Memory, RO\n");
-       test_futex(futex_ptr, 1);
+       test_futex(futex_ptr, EFAULT);
 
        mprotect(futex_ptr, mem_size, PROT_NONE);
        ksft_print_msg("Memory, no access\n");
-       test_futex(futex_ptr, 1);
+       test_futex(futex_ptr, EFAULT);
 
        mprotect(futex_ptr, mem_size, PROT_READ | PROT_WRITE);
        ksft_print_msg("Memory back to RW\n");