Several tests in the posix_timers selftest which test timer behavior
related to SIG_IGN fail on kernels older than 6.13. This is due to
a refactoring of signal handling in commit caf77435dd8a ("signal:
Handle ignored signals in do_sigaction(action != SIG_IGN)").

A previous attempt to fix this by adding a kernel version check to each
of the nine affected tests was suboptimal, as it resulted in emitting
the same skip message nine times.

Following the suggestion from Thomas Gleixner, this is refactored to
perform a single version check in main(). To satisfy the kselftest
framework's requirement for the test count to match the declared plan,
the plan is now conditionally set to 10 (for older kernels) or 19.

While setting the plan conditionally may seem complex, it is the
better approach to avoid the alternatives: either running tests on
unsupported kernels that are known to fail, or emitting a noisy series
of nine identical skip messages. A single informational message is now
printed instead when the tests are skipped.

Link: https://lore.kernel.org/all/[email protected]/
Signed-off-by: Wake Liu <[email protected]>
---
 tools/testing/selftests/timers/posix_timers.c | 32 +++++++++++++------
 1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/tools/testing/selftests/timers/posix_timers.c 
b/tools/testing/selftests/timers/posix_timers.c
index f0eceb0faf34..a563c438ac79 100644
--- a/tools/testing/selftests/timers/posix_timers.c
+++ b/tools/testing/selftests/timers/posix_timers.c
@@ -18,6 +18,7 @@
 #include <time.h>
 #include <include/vdso/time64.h>
 #include <pthread.h>
+#include <stdbool.h>
 
 #include "../kselftest.h"
 
@@ -670,8 +671,14 @@ static void check_timer_create_exact(void)
 
 int main(int argc, char **argv)
 {
+       bool run_sig_ign_tests = ksft_min_kernel_version(6, 13);
+
        ksft_print_header();
-       ksft_set_plan(19);
+       if (run_sig_ign_tests) {
+               ksft_set_plan(19);
+       } else {
+               ksft_set_plan(10);
+       }
 
        ksft_print_msg("Testing posix timers. False negative may happen on CPU 
execution \n");
        ksft_print_msg("based timers if other threads run on the CPU...\n");
@@ -695,15 +702,20 @@ int main(int argc, char **argv)
        check_timer_create(CLOCK_PROCESS_CPUTIME_ID, 
"CLOCK_PROCESS_CPUTIME_ID");
        check_timer_distribution();
 
-       check_sig_ign(0);
-       check_sig_ign(1);
-       check_rearm();
-       check_delete();
-       check_sigev_none(CLOCK_MONOTONIC, "CLOCK_MONOTONIC");
-       check_sigev_none(CLOCK_PROCESS_CPUTIME_ID, "CLOCK_PROCESS_CPUTIME_ID");
-       check_gettime(CLOCK_MONOTONIC, "CLOCK_MONOTONIC");
-       check_gettime(CLOCK_PROCESS_CPUTIME_ID, "CLOCK_PROCESS_CPUTIME_ID");
-       check_gettime(CLOCK_THREAD_CPUTIME_ID, "CLOCK_THREAD_CPUTIME_ID");
+       if (run_sig_ign_tests) {
+               check_sig_ign(0);
+               check_sig_ign(1);
+               check_rearm();
+               check_delete();
+               check_sigev_none(CLOCK_MONOTONIC, "CLOCK_MONOTONIC");
+               check_sigev_none(CLOCK_PROCESS_CPUTIME_ID, 
"CLOCK_PROCESS_CPUTIME_ID");
+               check_gettime(CLOCK_MONOTONIC, "CLOCK_MONOTONIC");
+               check_gettime(CLOCK_PROCESS_CPUTIME_ID, 
"CLOCK_PROCESS_CPUTIME_ID");
+               check_gettime(CLOCK_THREAD_CPUTIME_ID, 
"CLOCK_THREAD_CPUTIME_ID");
+       } else {
+               ksft_print_msg("Skipping SIG_IGN tests on kernel < 6.13\n");
+       }
+
        check_overrun(CLOCK_MONOTONIC, "CLOCK_MONOTONIC");
        check_overrun(CLOCK_PROCESS_CPUTIME_ID, "CLOCK_PROCESS_CPUTIME_ID");
        check_overrun(CLOCK_THREAD_CPUTIME_ID, "CLOCK_THREAD_CPUTIME_ID");
-- 
2.51.1.930.gacf6e81ea2-goog


Reply via email to