Commit 2c2b5613 authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Frederic Weisbecker

selftests/timers/posix-timers: Validate SIGEV_NONE

Posix timers with a delivery mode of SIGEV_NONE deliver no signals but the
remaining expiry time must be readable via timer_gettime() for both one
shot and interval timers.

That's implemented correctly for regular posix timers but broken for posix
CPU timers.

Add a self test so the fixes can be verified.
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarFrederic Weisbecker <frederic@kernel.org>
parent e65bb03e
......@@ -11,6 +11,7 @@
#include <sys/types.h>
#include <stdio.h>
#include <signal.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
......@@ -20,6 +21,7 @@
#define DELAY 2
#define USECS_PER_SEC 1000000
#define NSECS_PER_SEC 1000000000
static void __fatal_error(const char *test, const char *name, const char *what)
{
......@@ -438,10 +440,57 @@ static void check_delete(void)
ksft_test_result(!tsig.signals, "check_delete\n");
}
static inline int64_t calcdiff_ns(struct timespec t1, struct timespec t2)
{
int64_t diff;
diff = NSECS_PER_SEC * (int64_t)((int) t1.tv_sec - (int) t2.tv_sec);
diff += ((int) t1.tv_nsec - (int) t2.tv_nsec);
return diff;
}
static void check_sigev_none(int which, const char *name)
{
struct timespec start, now;
struct itimerspec its;
struct sigevent sev;
timer_t timerid;
memset(&sev, 0, sizeof(sev));
sev.sigev_notify = SIGEV_NONE;
if (timer_create(which, &sev, &timerid))
fatal_error(name, "timer_create()");
/* Start the timer to expire in 100ms and 100ms intervals */
its.it_value.tv_sec = 0;
its.it_value.tv_nsec = 100000000;
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 100000000;
timer_settime(timerid, 0, &its, NULL);
if (clock_gettime(which, &start))
fatal_error(name, "clock_gettime()");
do {
if (clock_gettime(which, &now))
fatal_error(name, "clock_gettime()");
} while (calcdiff_ns(now, start) < NSECS_PER_SEC);
if (timer_gettime(timerid, &its))
fatal_error(name, "timer_gettime()");
if (timer_delete(timerid))
fatal_error(name, "timer_delete()");
ksft_test_result(its.it_value.tv_sec || its.it_value.tv_nsec,
"check_sigev_none %s\n", name);
}
int main(int argc, char **argv)
{
ksft_print_header();
ksft_set_plan(10);
ksft_set_plan(12);
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");
......@@ -467,6 +516,8 @@ int main(int argc, char **argv)
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");
ksft_finished();
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment