No functional change.
Signed-off-by: Thomas Gleixner tglx@linutronix.de [edliaw: Fix checkpatch recommendations] Signed-off-by: Edward Liaw edliaw@google.com --- tools/testing/selftests/timers/posix_timers.c | 161 +++++++----------- 1 file changed, 66 insertions(+), 95 deletions(-)
diff --git a/tools/testing/selftests/timers/posix_timers.c b/tools/testing/selftests/timers/posix_timers.c index 03779b6b3c20..0f550fc9e879 100644 --- a/tools/testing/selftests/timers/posix_timers.c +++ b/tools/testing/selftests/timers/posix_timers.c @@ -10,6 +10,7 @@ #include <sys/time.h> #include <stdio.h> #include <signal.h> +#include <string.h> #include <unistd.h> #include <time.h> #include <pthread.h> @@ -19,6 +20,20 @@ #define DELAY 2 #define USECS_PER_SEC 1000000
+static void __fatal_error(const char *test, const char *name, const char *what) +{ + char buf[64]; + + strerror_r(errno, buf, sizeof(buf)); + + if (name && strlen(name)) + ksft_exit_fail_msg("%s %s %s %s\n", test, name, what, buf); + else + ksft_exit_fail_msg("%s %s %s\n", test, what, buf); +} + +#define fatal_error(name, what) __fatal_error(__func__, name, what) + static volatile int done;
/* Busy loop in userspace to elapse ITIMER_VIRTUAL */ @@ -67,15 +82,13 @@ static int check_diff(struct timeval start, struct timeval end) diff = end.tv_usec - start.tv_usec; diff += (end.tv_sec - start.tv_sec) * USECS_PER_SEC;
- if (abs(diff - DELAY * USECS_PER_SEC) > USECS_PER_SEC / 2) { - printf("Diff too high: %lld..", diff); + if (abs(diff - DELAY * USECS_PER_SEC) > USECS_PER_SEC / 2) return -1; - }
return 0; }
-static int check_itimer(int which) +static void check_itimer(int which) { const char *name; int err; @@ -91,7 +104,7 @@ static int check_itimer(int which) else if (which == ITIMER_REAL) name = "ITIMER_REAL"; else - return -1; + ksft_exit_fail_msg("Unknown setitimer() type %d\n", which);
done = 0;
@@ -103,16 +116,12 @@ static int check_itimer(int which) signal(SIGALRM, sig_handler);
err = gettimeofday(&start, NULL); - if (err < 0) { - ksft_perror("Can't call gettimeofday()"); - return -1; - } + if (err < 0) + fatal_error(name, "gettimeofday()");
err = setitimer(which, &val, NULL); - if (err < 0) { - ksft_perror("Can't set timer"); - return -1; - } + if (err < 0) + fatal_error(name, "setitimer()");
if (which == ITIMER_VIRTUAL) user_loop(); @@ -122,19 +131,15 @@ static int check_itimer(int which) idle_loop();
err = gettimeofday(&end, NULL); - if (err < 0) { - ksft_perror("Can't call gettimeofday()"); - return -1; - } + if (err < 0) + fatal_error(name, "gettimeofday()");
- ksft_test_result(check_diff(start, end) == 0, "%s\n", name); - - return 0; + ksft_test_result(!check_diff(start, end), "%s %s\n", __func__, name); }
-static int check_timer_create(int which) +static void check_timer_create(int which) { - const char *type; + const char *name; int err; timer_t id; struct timeval start, end; @@ -142,47 +147,37 @@ static int check_timer_create(int which) .it_value.tv_sec = DELAY, };
- if (which == CLOCK_THREAD_CPUTIME_ID) { - type = "thread"; - } else if (which == CLOCK_PROCESS_CPUTIME_ID) { - type = "process"; - } else { - ksft_print_msg("Unknown timer_create() type %d\n", which); - return -1; - } + if (which == CLOCK_THREAD_CPUTIME_ID) + name = "thread"; + else if (which == CLOCK_PROCESS_CPUTIME_ID) + name = "process"; + else + ksft_exit_fail_msg("Unknown timer_create() type %d\n", which);
done = 0; err = timer_create(which, NULL, &id); - if (err < 0) { - ksft_perror("Can't create timer"); - return -1; - } - signal(SIGALRM, sig_handler); + if (err < 0) + fatal_error(name, "timer_create()"); + + if (signal(SIGALRM, sig_handler) == SIG_ERR) + fatal_error(name, "signal()");
err = gettimeofday(&start, NULL); - if (err < 0) { - ksft_perror("Can't call gettimeofday()"); - return -1; - } + if (err < 0) + fatal_error(name, "gettimeofday()");
err = timer_settime(id, 0, &val, NULL); - if (err < 0) { - ksft_perror("Can't set timer"); - return -1; - } + if (err < 0) + fatal_error(name, "timer_settime()");
user_loop();
err = gettimeofday(&end, NULL); - if (err < 0) { - ksft_perror("Can't call gettimeofday()"); - return -1; - } + if (err < 0) + fatal_error(name, "gettimeofday()");
ksft_test_result(check_diff(start, end) == 0, - "timer_create() per %s\n", type); - - return 0; + "%s %s\n", __func__, name); }
static int remain; @@ -205,7 +200,7 @@ static void distribution_handler(int nr) * Test that all running threads _eventually_ receive CLOCK_PROCESS_CPUTIME_ID * timer signals. This primarily tests that the kernel does not favour any one. */ -static int check_timer_distribution(void) +static void check_timer_distribution(void) { const int nthreads = 10; pthread_t threads[nthreads]; @@ -221,26 +216,20 @@ static int check_timer_distribution(void)
done = 0; remain = nthreads + 1; /* worker threads + this thread */ - signal(SIGALRM, distribution_handler); + if (signal(SIGALRM, distribution_handler) == SIG_ERR) + fatal_error(NULL, "signal()"); + err = timer_create(CLOCK_PROCESS_CPUTIME_ID, NULL, &id); - if (err < 0) { - ksft_perror("Can't create timer"); - return -1; - } + if (err < 0) + fatal_error(NULL, "timer_create()"); + err = timer_settime(id, 0, &val, NULL); - if (err < 0) { - ksft_perror("Can't set timer"); - return -1; - } + if (err < 0) + fatal_error(NULL, "timer_settime()");
for (i = 0; i < nthreads; i++) { - err = pthread_create(&threads[i], NULL, distribution_thread, - NULL); - if (err) { - ksft_print_msg("Can't create thread: %s (%d)\n", - strerror(errno), errno); - return -1; - } + if (pthread_create(&threads[i], NULL, distribution_thread, NULL)) + fatal_error(NULL, "pthread_create()"); }
/* Wait for all threads to receive the signal. */ @@ -252,23 +241,15 @@ static int check_timer_distribution(void) } done = 1;
- if (timer_delete(id)) { - ksft_perror("Can't delete timer\n"); - return -1; - } + if (timer_delete(id)) + fatal_error(NULL, "timer_delete()");
for (i = 0; i < nthreads; i++) { - err = pthread_join(threads[i], NULL); - if (err) { - ksft_print_msg("Can't join thread: %s (%d)\n", - strerror(errno), errno); - return -1; - } + if (pthread_join(threads[i], NULL)) + fatal_error(NULL, "pthread_join()"); }
ksft_test_result((now - start <= 5), "%s\n", __func__); - - return 0; }
int main(int argc, char **argv) @@ -279,17 +260,10 @@ int main(int argc, char **argv) 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");
- if (check_itimer(ITIMER_VIRTUAL) < 0) - return ksft_exit_fail(); - - if (check_itimer(ITIMER_PROF) < 0) - return ksft_exit_fail(); - - if (check_itimer(ITIMER_REAL) < 0) - return ksft_exit_fail(); - - if (check_timer_create(CLOCK_THREAD_CPUTIME_ID) < 0) - return ksft_exit_fail(); + check_itimer(ITIMER_VIRTUAL); + check_itimer(ITIMER_PROF); + check_itimer(ITIMER_REAL); + check_timer_create(CLOCK_THREAD_CPUTIME_ID);
/* * It's unfortunately hard to reliably test a timer expiration @@ -300,11 +274,8 @@ int main(int argc, char **argv) * to ensure true parallelism. So test only one thread until we * find a better solution. */ - if (check_timer_create(CLOCK_PROCESS_CPUTIME_ID) < 0) - return ksft_exit_fail(); - - if (check_timer_distribution() < 0) - return ksft_exit_fail(); + check_timer_create(CLOCK_PROCESS_CPUTIME_ID); + check_timer_distribution();
ksft_finished(); }