On Sat, 6 Apr 2024 at 17:12, Oleg Nesterov <oleg@xxxxxxxxxx> wrote: > > Dmitry, Thomas, > > To simplify the review I've attached the code with this patch applied below. > > Yes, this changes the "semantics" of check_timer_distribution(), perhaps it > should be renamed. > > But I do not see a better approach, and in fact I think that > > Test that all running threads _eventually_ receive CLOCK_PROCESS_CPUTIME_ID > > is the wrong goal. > > Do you agree? > > Oleg. > ------------------------------------------------------------------------------- > > static pthread_t ctd_thread; > static volatile int ctd_count, ctd_failed; > > static void ctd_sighandler(int sig) > { > if (pthread_self() != ctd_thread) > ctd_failed = 1; > ctd_count--; > } > > static void *ctd_thread_func(void *arg) > { > struct itimerspec val = { > .it_value.tv_sec = 0, > .it_value.tv_nsec = 1000 * 1000, > .it_interval.tv_sec = 0, > .it_interval.tv_nsec = 1000 * 1000, > }; > timer_t id; > > /* 1/10 seconds to ensure the leader sleeps */ > usleep(10000); > > ctd_count = 100; > if (timer_create(CLOCK_PROCESS_CPUTIME_ID, NULL, &id)) > return "Can't create timer"; > if (timer_settime(id, 0, &val, NULL)) > return "Can't set timer"; > > while (ctd_count > 0 && !ctd_failed) > ; > > if (timer_delete(id)) > return "Can't delete timer"; > > return NULL; > } > > /* > * Test that only the running thread receives the timer signal. > */ > static int check_timer_distribution(void) > { > const char *errmsg; > > signal(SIGALRM, ctd_sighandler); > > errmsg = "Can't create thread"; > if (pthread_create(&ctd_thread, NULL, ctd_thread_func, NULL)) > goto err; > > errmsg = "Can't join thread"; > if (pthread_join(ctd_thread, (void **)&errmsg) || errmsg) > goto err; > > if (ctd_failed) > ksft_test_result_skip("No signal distribution. Assuming old kernel\n"); Shouldn't the test fail here? The goal of a test is to fail when things don't work. I don't see any other ksft_test_result_fail() calls, and it does not look that the test will hang on incorrect distribution. > else > ksft_test_result_pass("check signal distribution\n"); > > return 0; > err: > ksft_print_msg(errmsg); > return -1; > } >