1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 2013 Red Hat, Inc., Frederic Weisbecker <fweisbec@redhat.com> 4 * 5 * Selftests for a few posix timers interface. 6 * 7 * Kernel loop code stolen from Steven Rostedt <srostedt@redhat.com> 8 */ 9 #define _GNU_SOURCE 10 #include <sys/prctl.h> 11 #include <sys/time.h> 12 #include <sys/types.h> 13 #include <stdio.h> 14 #include <signal.h> 15 #include <stdint.h> 16 #include <string.h> 17 #include <unistd.h> 18 #include <time.h> 19 #include <include/vdso/time64.h> 20 #include <pthread.h> 21 #include <stdbool.h> 22 23 #include "../kselftest.h" 24 25 #define DELAY 2 26 27 static void __fatal_error(const char *test, const char *name, const char *what) 28 { 29 char buf[64]; 30 char *ret_str = NULL; 31 32 ret_str = strerror_r(errno, buf, sizeof(buf)); 33 34 if (name && strlen(name) && ret_str) 35 ksft_exit_fail_msg("%s %s %s %s\n", test, name, what, ret_str); 36 else if (ret_str) 37 ksft_exit_fail_msg("%s %s %s\n", test, what, ret_str); 38 else 39 ksft_exit_fail_msg("%s %s\n", test, what); 40 41 } 42 43 #define fatal_error(name, what) __fatal_error(__func__, name, what) 44 45 static volatile int done; 46 47 /* Busy loop in userspace to elapse ITIMER_VIRTUAL */ 48 static void user_loop(void) 49 { 50 while (!done); 51 } 52 53 /* 54 * Try to spend as much time as possible in kernelspace 55 * to elapse ITIMER_PROF. 56 */ 57 static void kernel_loop(void) 58 { 59 void *addr = sbrk(0); 60 int err = 0; 61 62 while (!done && !err) { 63 err = brk(addr + 4096); 64 err |= brk(addr); 65 } 66 } 67 68 /* 69 * Sleep until ITIMER_REAL expiration. 70 */ 71 static void idle_loop(void) 72 { 73 pause(); 74 } 75 76 static void sig_handler(int nr) 77 { 78 done = 1; 79 } 80 81 /* 82 * Check the expected timer expiration matches the GTOD elapsed delta since 83 * we armed the timer. Keep a 0.5 sec error margin due to various jitter. 84 */ 85 static int check_diff(struct timeval start, struct timeval end) 86 { 87 long long diff; 88 89 diff = end.tv_usec - start.tv_usec; 90 diff += (end.tv_sec - start.tv_sec) * USEC_PER_SEC; 91 92 if (llabs(diff - DELAY * USEC_PER_SEC) > USEC_PER_SEC / 2) { 93 printf("Diff too high: %lld..", diff); 94 return -1; 95 } 96 97 return 0; 98 } 99 100 static void check_itimer(int which, const char *name) 101 { 102 struct timeval start, end; 103 struct itimerval val = { 104 .it_value.tv_sec = DELAY, 105 }; 106 107 done = 0; 108 109 if (which == ITIMER_VIRTUAL) 110 signal(SIGVTALRM, sig_handler); 111 else if (which == ITIMER_PROF) 112 signal(SIGPROF, sig_handler); 113 else if (which == ITIMER_REAL) 114 signal(SIGALRM, sig_handler); 115 116 if (gettimeofday(&start, NULL) < 0) 117 fatal_error(name, "gettimeofday()"); 118 119 if (setitimer(which, &val, NULL) < 0) 120 fatal_error(name, "setitimer()"); 121 122 if (which == ITIMER_VIRTUAL) 123 user_loop(); 124 else if (which == ITIMER_PROF) 125 kernel_loop(); 126 else if (which == ITIMER_REAL) 127 idle_loop(); 128 129 if (gettimeofday(&end, NULL) < 0) 130 fatal_error(name, "gettimeofday()"); 131 132 ksft_test_result(check_diff(start, end) == 0, "%s\n", name); 133 } 134 135 static void check_timer_create(int which, const char *name) 136 { 137 struct timeval start, end; 138 struct itimerspec val = { 139 .it_value.tv_sec = DELAY, 140 }; 141 timer_t id; 142 143 done = 0; 144 145 if (timer_create(which, NULL, &id) < 0) 146 fatal_error(name, "timer_create()"); 147 148 if (signal(SIGALRM, sig_handler) == SIG_ERR) 149 fatal_error(name, "signal()"); 150 151 if (gettimeofday(&start, NULL) < 0) 152 fatal_error(name, "gettimeofday()"); 153 154 if (timer_settime(id, 0, &val, NULL) < 0) 155 fatal_error(name, "timer_settime()"); 156 157 user_loop(); 158 159 if (gettimeofday(&end, NULL) < 0) 160 fatal_error(name, "gettimeofday()"); 161 162 ksft_test_result(check_diff(start, end) == 0, 163 "timer_create() per %s\n", name); 164 } 165 166 static pthread_t ctd_thread; 167 static volatile int ctd_count, ctd_failed; 168 169 static void ctd_sighandler(int sig) 170 { 171 if (pthread_self() != ctd_thread) 172 ctd_failed = 1; 173 ctd_count--; 174 } 175 176 static void *ctd_thread_func(void *arg) 177 { 178 struct itimerspec val = { 179 .it_value.tv_sec = 0, 180 .it_value.tv_nsec = 1000 * 1000, 181 .it_interval.tv_sec = 0, 182 .it_interval.tv_nsec = 1000 * 1000, 183 }; 184 timer_t id; 185 186 /* 1/10 seconds to ensure the leader sleeps */ 187 usleep(10000); 188 189 ctd_count = 100; 190 if (timer_create(CLOCK_PROCESS_CPUTIME_ID, NULL, &id)) 191 fatal_error(NULL, "timer_create()"); 192 if (timer_settime(id, 0, &val, NULL)) 193 fatal_error(NULL, "timer_settime()"); 194 while (ctd_count > 0 && !ctd_failed) 195 ; 196 197 if (timer_delete(id)) 198 fatal_error(NULL, "timer_delete()"); 199 200 return NULL; 201 } 202 203 /* 204 * Test that only the running thread receives the timer signal. 205 */ 206 static void check_timer_distribution(void) 207 { 208 if (signal(SIGALRM, ctd_sighandler) == SIG_ERR) 209 fatal_error(NULL, "signal()"); 210 211 if (pthread_create(&ctd_thread, NULL, ctd_thread_func, NULL)) 212 fatal_error(NULL, "pthread_create()"); 213 214 if (pthread_join(ctd_thread, NULL)) 215 fatal_error(NULL, "pthread_join()"); 216 217 if (!ctd_failed) 218 ksft_test_result_pass("check signal distribution\n"); 219 else if (ksft_min_kernel_version(6, 3)) 220 ksft_test_result_fail("check signal distribution\n"); 221 else 222 ksft_test_result_skip("check signal distribution (old kernel)\n"); 223 } 224 225 struct tmrsig { 226 int signals; 227 int overruns; 228 }; 229 230 static void siginfo_handler(int sig, siginfo_t *si, void *uc) 231 { 232 struct tmrsig *tsig = si ? si->si_ptr : NULL; 233 234 if (tsig) { 235 tsig->signals++; 236 tsig->overruns += si->si_overrun; 237 } 238 } 239 240 static void *ignore_thread(void *arg) 241 { 242 unsigned int *tid = arg; 243 sigset_t set; 244 245 sigemptyset(&set); 246 sigaddset(&set, SIGUSR1); 247 if (sigprocmask(SIG_BLOCK, &set, NULL)) 248 fatal_error(NULL, "sigprocmask(SIG_BLOCK)"); 249 250 *tid = gettid(); 251 sleep(100); 252 253 if (sigprocmask(SIG_UNBLOCK, &set, NULL)) 254 fatal_error(NULL, "sigprocmask(SIG_UNBLOCK)"); 255 return NULL; 256 } 257 258 static void check_sig_ign(int thread) 259 { 260 struct tmrsig tsig = { }; 261 struct itimerspec its; 262 unsigned int tid = 0; 263 struct sigaction sa; 264 struct sigevent sev; 265 pthread_t pthread; 266 timer_t timerid; 267 sigset_t set; 268 269 if (thread) { 270 if (pthread_create(&pthread, NULL, ignore_thread, &tid)) 271 fatal_error(NULL, "pthread_create()"); 272 sleep(1); 273 } 274 275 sa.sa_flags = SA_SIGINFO; 276 sa.sa_sigaction = siginfo_handler; 277 sigemptyset(&sa.sa_mask); 278 if (sigaction(SIGUSR1, &sa, NULL)) 279 fatal_error(NULL, "sigaction()"); 280 281 /* Block the signal */ 282 sigemptyset(&set); 283 sigaddset(&set, SIGUSR1); 284 if (sigprocmask(SIG_BLOCK, &set, NULL)) 285 fatal_error(NULL, "sigprocmask(SIG_BLOCK)"); 286 287 memset(&sev, 0, sizeof(sev)); 288 sev.sigev_notify = SIGEV_SIGNAL; 289 sev.sigev_signo = SIGUSR1; 290 sev.sigev_value.sival_ptr = &tsig; 291 if (thread) { 292 sev.sigev_notify = SIGEV_THREAD_ID; 293 sev._sigev_un._tid = tid; 294 } 295 296 if (timer_create(CLOCK_MONOTONIC, &sev, &timerid)) 297 fatal_error(NULL, "timer_create()"); 298 299 /* Start the timer to expire in 100ms and 100ms intervals */ 300 its.it_value.tv_sec = 0; 301 its.it_value.tv_nsec = 100000000; 302 its.it_interval.tv_sec = 0; 303 its.it_interval.tv_nsec = 100000000; 304 timer_settime(timerid, 0, &its, NULL); 305 306 sleep(1); 307 308 /* Set the signal to be ignored */ 309 if (signal(SIGUSR1, SIG_IGN) == SIG_ERR) 310 fatal_error(NULL, "signal(SIG_IGN)"); 311 312 sleep(1); 313 314 if (thread) { 315 /* Stop the thread first. No signal should be delivered to it */ 316 if (pthread_cancel(pthread)) 317 fatal_error(NULL, "pthread_cancel()"); 318 if (pthread_join(pthread, NULL)) 319 fatal_error(NULL, "pthread_join()"); 320 } 321 322 /* Restore the handler */ 323 if (sigaction(SIGUSR1, &sa, NULL)) 324 fatal_error(NULL, "sigaction()"); 325 326 sleep(1); 327 328 /* Unblock it, which should deliver the signal in the !thread case*/ 329 if (sigprocmask(SIG_UNBLOCK, &set, NULL)) 330 fatal_error(NULL, "sigprocmask(SIG_UNBLOCK)"); 331 332 if (timer_delete(timerid)) 333 fatal_error(NULL, "timer_delete()"); 334 335 if (!thread) { 336 ksft_test_result(tsig.signals == 1 && tsig.overruns == 29, 337 "check_sig_ign SIGEV_SIGNAL\n"); 338 } else { 339 ksft_test_result(tsig.signals == 0 && tsig.overruns == 0, 340 "check_sig_ign SIGEV_THREAD_ID\n"); 341 } 342 } 343 344 static void check_rearm(void) 345 { 346 struct tmrsig tsig = { }; 347 struct itimerspec its; 348 struct sigaction sa; 349 struct sigevent sev; 350 timer_t timerid; 351 sigset_t set; 352 353 sa.sa_flags = SA_SIGINFO; 354 sa.sa_sigaction = siginfo_handler; 355 sigemptyset(&sa.sa_mask); 356 if (sigaction(SIGUSR1, &sa, NULL)) 357 fatal_error(NULL, "sigaction()"); 358 359 /* Block the signal */ 360 sigemptyset(&set); 361 sigaddset(&set, SIGUSR1); 362 if (sigprocmask(SIG_BLOCK, &set, NULL)) 363 fatal_error(NULL, "sigprocmask(SIG_BLOCK)"); 364 365 memset(&sev, 0, sizeof(sev)); 366 sev.sigev_notify = SIGEV_SIGNAL; 367 sev.sigev_signo = SIGUSR1; 368 sev.sigev_value.sival_ptr = &tsig; 369 if (timer_create(CLOCK_MONOTONIC, &sev, &timerid)) 370 fatal_error(NULL, "timer_create()"); 371 372 /* Start the timer to expire in 100ms and 100ms intervals */ 373 its.it_value.tv_sec = 0; 374 its.it_value.tv_nsec = 100000000; 375 its.it_interval.tv_sec = 0; 376 its.it_interval.tv_nsec = 100000000; 377 if (timer_settime(timerid, 0, &its, NULL)) 378 fatal_error(NULL, "timer_settime()"); 379 380 sleep(1); 381 382 /* Reprogram the timer to single shot */ 383 its.it_value.tv_sec = 10; 384 its.it_value.tv_nsec = 0; 385 its.it_interval.tv_sec = 0; 386 its.it_interval.tv_nsec = 0; 387 if (timer_settime(timerid, 0, &its, NULL)) 388 fatal_error(NULL, "timer_settime()"); 389 390 /* Unblock it, which should not deliver a signal */ 391 if (sigprocmask(SIG_UNBLOCK, &set, NULL)) 392 fatal_error(NULL, "sigprocmask(SIG_UNBLOCK)"); 393 394 if (timer_delete(timerid)) 395 fatal_error(NULL, "timer_delete()"); 396 397 ksft_test_result(!tsig.signals, "check_rearm\n"); 398 } 399 400 static void check_delete(void) 401 { 402 struct tmrsig tsig = { }; 403 struct itimerspec its; 404 struct sigaction sa; 405 struct sigevent sev; 406 timer_t timerid; 407 sigset_t set; 408 409 sa.sa_flags = SA_SIGINFO; 410 sa.sa_sigaction = siginfo_handler; 411 sigemptyset(&sa.sa_mask); 412 if (sigaction(SIGUSR1, &sa, NULL)) 413 fatal_error(NULL, "sigaction()"); 414 415 /* Block the signal */ 416 sigemptyset(&set); 417 sigaddset(&set, SIGUSR1); 418 if (sigprocmask(SIG_BLOCK, &set, NULL)) 419 fatal_error(NULL, "sigprocmask(SIG_BLOCK)"); 420 421 memset(&sev, 0, sizeof(sev)); 422 sev.sigev_notify = SIGEV_SIGNAL; 423 sev.sigev_signo = SIGUSR1; 424 sev.sigev_value.sival_ptr = &tsig; 425 if (timer_create(CLOCK_MONOTONIC, &sev, &timerid)) 426 fatal_error(NULL, "timer_create()"); 427 428 /* Start the timer to expire in 100ms and 100ms intervals */ 429 its.it_value.tv_sec = 0; 430 its.it_value.tv_nsec = 100000000; 431 its.it_interval.tv_sec = 0; 432 its.it_interval.tv_nsec = 100000000; 433 if (timer_settime(timerid, 0, &its, NULL)) 434 fatal_error(NULL, "timer_settime()"); 435 436 sleep(1); 437 438 if (timer_delete(timerid)) 439 fatal_error(NULL, "timer_delete()"); 440 441 /* Unblock it, which should not deliver a signal */ 442 if (sigprocmask(SIG_UNBLOCK, &set, NULL)) 443 fatal_error(NULL, "sigprocmask(SIG_UNBLOCK)"); 444 445 ksft_test_result(!tsig.signals, "check_delete\n"); 446 } 447 448 static inline int64_t calcdiff_ns(struct timespec t1, struct timespec t2) 449 { 450 int64_t diff; 451 452 diff = NSEC_PER_SEC * (int64_t)((int) t1.tv_sec - (int) t2.tv_sec); 453 diff += ((int) t1.tv_nsec - (int) t2.tv_nsec); 454 return diff; 455 } 456 457 static void check_sigev_none(int which, const char *name) 458 { 459 struct timespec start, now; 460 struct itimerspec its; 461 struct sigevent sev; 462 timer_t timerid; 463 464 memset(&sev, 0, sizeof(sev)); 465 sev.sigev_notify = SIGEV_NONE; 466 467 if (timer_create(which, &sev, &timerid)) 468 fatal_error(name, "timer_create()"); 469 470 /* Start the timer to expire in 100ms and 100ms intervals */ 471 its.it_value.tv_sec = 0; 472 its.it_value.tv_nsec = 100000000; 473 its.it_interval.tv_sec = 0; 474 its.it_interval.tv_nsec = 100000000; 475 timer_settime(timerid, 0, &its, NULL); 476 477 if (clock_gettime(which, &start)) 478 fatal_error(name, "clock_gettime()"); 479 480 do { 481 if (clock_gettime(which, &now)) 482 fatal_error(name, "clock_gettime()"); 483 } while (calcdiff_ns(now, start) < NSEC_PER_SEC); 484 485 if (timer_gettime(timerid, &its)) 486 fatal_error(name, "timer_gettime()"); 487 488 if (timer_delete(timerid)) 489 fatal_error(name, "timer_delete()"); 490 491 ksft_test_result(its.it_value.tv_sec || its.it_value.tv_nsec, 492 "check_sigev_none %s\n", name); 493 } 494 495 static void check_gettime(int which, const char *name) 496 { 497 struct itimerspec its, prev; 498 struct timespec start, now; 499 struct sigevent sev; 500 timer_t timerid; 501 int wraps = 0; 502 sigset_t set; 503 504 /* Block the signal */ 505 sigemptyset(&set); 506 sigaddset(&set, SIGUSR1); 507 if (sigprocmask(SIG_BLOCK, &set, NULL)) 508 fatal_error(name, "sigprocmask(SIG_BLOCK)"); 509 510 memset(&sev, 0, sizeof(sev)); 511 sev.sigev_notify = SIGEV_SIGNAL; 512 sev.sigev_signo = SIGUSR1; 513 514 if (timer_create(which, &sev, &timerid)) 515 fatal_error(name, "timer_create()"); 516 517 /* Start the timer to expire in 100ms and 100ms intervals */ 518 its.it_value.tv_sec = 0; 519 its.it_value.tv_nsec = 100000000; 520 its.it_interval.tv_sec = 0; 521 its.it_interval.tv_nsec = 100000000; 522 if (timer_settime(timerid, 0, &its, NULL)) 523 fatal_error(name, "timer_settime()"); 524 525 if (timer_gettime(timerid, &prev)) 526 fatal_error(name, "timer_gettime()"); 527 528 if (clock_gettime(which, &start)) 529 fatal_error(name, "clock_gettime()"); 530 531 do { 532 if (clock_gettime(which, &now)) 533 fatal_error(name, "clock_gettime()"); 534 if (timer_gettime(timerid, &its)) 535 fatal_error(name, "timer_gettime()"); 536 if (its.it_value.tv_nsec > prev.it_value.tv_nsec) 537 wraps++; 538 prev = its; 539 540 } while (calcdiff_ns(now, start) < NSEC_PER_SEC); 541 542 if (timer_delete(timerid)) 543 fatal_error(name, "timer_delete()"); 544 545 ksft_test_result(wraps > 1, "check_gettime %s\n", name); 546 } 547 548 static void check_overrun(int which, const char *name) 549 { 550 struct timespec start, now; 551 struct tmrsig tsig = { }; 552 struct itimerspec its; 553 struct sigaction sa; 554 struct sigevent sev; 555 timer_t timerid; 556 sigset_t set; 557 558 sa.sa_flags = SA_SIGINFO; 559 sa.sa_sigaction = siginfo_handler; 560 sigemptyset(&sa.sa_mask); 561 if (sigaction(SIGUSR1, &sa, NULL)) 562 fatal_error(name, "sigaction()"); 563 564 /* Block the signal */ 565 sigemptyset(&set); 566 sigaddset(&set, SIGUSR1); 567 if (sigprocmask(SIG_BLOCK, &set, NULL)) 568 fatal_error(name, "sigprocmask(SIG_BLOCK)"); 569 570 memset(&sev, 0, sizeof(sev)); 571 sev.sigev_notify = SIGEV_SIGNAL; 572 sev.sigev_signo = SIGUSR1; 573 sev.sigev_value.sival_ptr = &tsig; 574 if (timer_create(which, &sev, &timerid)) 575 fatal_error(name, "timer_create()"); 576 577 /* Start the timer to expire in 100ms and 100ms intervals */ 578 its.it_value.tv_sec = 0; 579 its.it_value.tv_nsec = 100000000; 580 its.it_interval.tv_sec = 0; 581 its.it_interval.tv_nsec = 100000000; 582 if (timer_settime(timerid, 0, &its, NULL)) 583 fatal_error(name, "timer_settime()"); 584 585 if (clock_gettime(which, &start)) 586 fatal_error(name, "clock_gettime()"); 587 588 do { 589 if (clock_gettime(which, &now)) 590 fatal_error(name, "clock_gettime()"); 591 } while (calcdiff_ns(now, start) < NSEC_PER_SEC); 592 593 /* Unblock it, which should deliver a signal */ 594 if (sigprocmask(SIG_UNBLOCK, &set, NULL)) 595 fatal_error(name, "sigprocmask(SIG_UNBLOCK)"); 596 597 if (timer_delete(timerid)) 598 fatal_error(name, "timer_delete()"); 599 600 ksft_test_result(tsig.signals == 1 && tsig.overruns == 9, 601 "check_overrun %s\n", name); 602 } 603 604 #include <sys/syscall.h> 605 606 static int do_timer_create(int *id) 607 { 608 return syscall(__NR_timer_create, CLOCK_MONOTONIC, NULL, id); 609 } 610 611 static int do_timer_delete(int id) 612 { 613 return syscall(__NR_timer_delete, id); 614 } 615 616 #ifndef PR_TIMER_CREATE_RESTORE_IDS 617 # define PR_TIMER_CREATE_RESTORE_IDS 77 618 # define PR_TIMER_CREATE_RESTORE_IDS_OFF 0 619 # define PR_TIMER_CREATE_RESTORE_IDS_ON 1 620 # define PR_TIMER_CREATE_RESTORE_IDS_GET 2 621 #endif 622 623 static void check_timer_create_exact(void) 624 { 625 int id; 626 627 if (prctl(PR_TIMER_CREATE_RESTORE_IDS, PR_TIMER_CREATE_RESTORE_IDS_ON, 0, 0, 0)) { 628 switch (errno) { 629 case EINVAL: 630 ksft_test_result_skip("check timer create exact, not supported\n"); 631 return; 632 default: 633 ksft_test_result_skip("check timer create exact, errno = %d\n", errno); 634 return; 635 } 636 } 637 638 if (prctl(PR_TIMER_CREATE_RESTORE_IDS, PR_TIMER_CREATE_RESTORE_IDS_GET, 0, 0, 0) != 1) 639 fatal_error(NULL, "prctl(GET) failed\n"); 640 641 id = 8; 642 if (do_timer_create(&id) < 0) 643 fatal_error(NULL, "timer_create()"); 644 645 if (do_timer_delete(id)) 646 fatal_error(NULL, "timer_delete()"); 647 648 if (prctl(PR_TIMER_CREATE_RESTORE_IDS, PR_TIMER_CREATE_RESTORE_IDS_OFF, 0, 0, 0)) 649 fatal_error(NULL, "prctl(OFF)"); 650 651 if (prctl(PR_TIMER_CREATE_RESTORE_IDS, PR_TIMER_CREATE_RESTORE_IDS_GET, 0, 0, 0) != 0) 652 fatal_error(NULL, "prctl(GET) failed\n"); 653 654 if (id != 8) { 655 ksft_test_result_fail("check timer create exact %d != 8\n", id); 656 return; 657 } 658 659 /* Validate that it went back to normal mode and allocates ID 9 */ 660 if (do_timer_create(&id) < 0) 661 fatal_error(NULL, "timer_create()"); 662 663 if (do_timer_delete(id)) 664 fatal_error(NULL, "timer_delete()"); 665 666 if (id == 9) 667 ksft_test_result_pass("check timer create exact\n"); 668 else 669 ksft_test_result_fail("check timer create exact. Disabling failed.\n"); 670 } 671 672 int main(int argc, char **argv) 673 { 674 bool run_sig_ign_tests = ksft_min_kernel_version(6, 13); 675 676 ksft_print_header(); 677 if (run_sig_ign_tests) { 678 ksft_set_plan(19); 679 } else { 680 ksft_set_plan(10); 681 } 682 683 ksft_print_msg("Testing posix timers. False negative may happen on CPU execution \n"); 684 ksft_print_msg("based timers if other threads run on the CPU...\n"); 685 686 check_timer_create_exact(); 687 688 check_itimer(ITIMER_VIRTUAL, "ITIMER_VIRTUAL"); 689 check_itimer(ITIMER_PROF, "ITIMER_PROF"); 690 check_itimer(ITIMER_REAL, "ITIMER_REAL"); 691 check_timer_create(CLOCK_THREAD_CPUTIME_ID, "CLOCK_THREAD_CPUTIME_ID"); 692 693 /* 694 * It's unfortunately hard to reliably test a timer expiration 695 * on parallel multithread cputime. We could arm it to expire 696 * on DELAY * nr_threads, with nr_threads busy looping, then wait 697 * the normal DELAY since the time is elapsing nr_threads faster. 698 * But for that we need to ensure we have real physical free CPUs 699 * to ensure true parallelism. So test only one thread until we 700 * find a better solution. 701 */ 702 check_timer_create(CLOCK_PROCESS_CPUTIME_ID, "CLOCK_PROCESS_CPUTIME_ID"); 703 check_timer_distribution(); 704 705 if (run_sig_ign_tests) { 706 check_sig_ign(0); 707 check_sig_ign(1); 708 check_rearm(); 709 check_delete(); 710 check_sigev_none(CLOCK_MONOTONIC, "CLOCK_MONOTONIC"); 711 check_sigev_none(CLOCK_PROCESS_CPUTIME_ID, "CLOCK_PROCESS_CPUTIME_ID"); 712 check_gettime(CLOCK_MONOTONIC, "CLOCK_MONOTONIC"); 713 check_gettime(CLOCK_PROCESS_CPUTIME_ID, "CLOCK_PROCESS_CPUTIME_ID"); 714 check_gettime(CLOCK_THREAD_CPUTIME_ID, "CLOCK_THREAD_CPUTIME_ID"); 715 } else { 716 ksft_print_msg("Skipping SIG_IGN tests on kernel < 6.13\n"); 717 } 718 719 check_overrun(CLOCK_MONOTONIC, "CLOCK_MONOTONIC"); 720 check_overrun(CLOCK_PROCESS_CPUTIME_ID, "CLOCK_PROCESS_CPUTIME_ID"); 721 check_overrun(CLOCK_THREAD_CPUTIME_ID, "CLOCK_THREAD_CPUTIME_ID"); 722 723 ksft_finished(); 724 } 725