summaryrefslogtreecommitdiff
path: root/tools/testing/selftests
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2026-09-30 09:33:17 +0200
committerIngo Molnar <mingo@kernel.org>2026-09-30 09:33:17 +0200
commit39c9d90a4ab3c66c04b78b8deaa84d6cc82b5bbf (patch)
treec0ececd5923c2b8173dbcfa5aa4d8b05b932c9f5 /tools/testing/selftests
parente6fa156b797041b0ae602f2fc9d570b551eb6b7f (diff)
parent348f54c435bf3177baa78201952810b255d44b30 (diff)
downloadlinux-next-39c9d90a4ab3c66c04b78b8deaa84d6cc82b5bbf.tar.gz
linux-next-39c9d90a4ab3c66c04b78b8deaa84d6cc82b5bbf.zip
Merge branch into tip/master: 'timers/core'
# New commits in timers/core: 348f54c435bf ("selftests/timers: clocksource-switch: Fix unchecked open()/read()") b03638013add ("selftests: timers: Measure the CPU timers on the clock they count") a252cb93e156 ("selftests: timers: Count what tick is worth in the drift estimate") 3945c4a3ea15 ("time/kunit: Add time64_to_tm() case beyond 32-bit day count") 2927f7ca7844 ("time: Prevent time64_to_tm() day truncation on 32-bit") bc5b66c300b8 ("timekeeping: Use READ_ONCE/WRITE_ONCE() for ktime_sec to prevent tearing") bb41ece16463 ("timers/migration: Mark racy updates to tmigr_event::ignore field") 1159ad0a6aaa ("timers: Mark racy updates to hlist_node::pprev field") 5dffe33bfdaf ("hrtimer: Apply READ_ONCE() to lockless base->running loads") ad80926d7803 ("hrtimer: Mark the hrtimer_sleeper structure's ->task field __private") 15f84398330c ("hrtimer: Update hrtimer_resolution only if value changes") 7eed1771a6e8 ("futex: Use accessor for hrtimer_sleeper ->task field in requeue") 9cd2f4e304d9 ("rtmutex: Use accessor for hrtimer_sleeper ->task field") 3990d196954a ("net: pktgen: Use accessor for hrtimer_sleeper ->task field") 9b7bcd671e9c ("timers: Use accessor for hrtimer_sleeper ->task field in sleep_timeout.c") fa3d486086d6 ("futex: Use accessor for hrtimer_sleeper ->task field in waitwake.c") 851c30277918 ("io-uring/rw: Use accessor for hrtimer_sleeper ->task field") 66b29025b676 ("wait: Use accessor for hrtimer_sleeper ->task field") cefc1a24ace5 ("aio: Use accessor for hrtimer_sleeper ->task field") d166a1cd9016 ("hrtimer: Mark data-racy accesses to hrtimer_sleeper ->task field") 7b07d15ed1d7 ("posix-timers: Handle exit in do_exit() completely") 54ad1e0ea42c ("posix-cpu-timers: Prevent enqueueing when PF_EXITING is set") 760ad335d600 ("posix-cpu-timers: Use PF_EXITING to indicate exit") 8e9ed3b66f40 ("posix-cpu-timers: Move inlines out of public header") 24adce0b86c9 ("posix-timers: Move POSIX timer group exit related code out of do_exit()") 7117334f022b ("posix-timers: Move posixtimer_exec_cleanup() out of exec.c") Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools/testing/selftests')
-rw-r--r--tools/testing/selftests/timers/clocksource-switch.c23
-rw-r--r--tools/testing/selftests/timers/posix_timers.c7
-rw-r--r--tools/testing/selftests/timers/raw_skew.c12
3 files changed, 36 insertions, 6 deletions
diff --git a/tools/testing/selftests/timers/clocksource-switch.c b/tools/testing/selftests/timers/clocksource-switch.c
index db62a764c29e..2e86f56d953e 100644
--- a/tools/testing/selftests/timers/clocksource-switch.c
+++ b/tools/testing/selftests/timers/clocksource-switch.c
@@ -40,16 +40,23 @@
int get_clocksources(char list[][30])
{
int fd, i;
- size_t size;
+ ssize_t size;
char buf[512];
char *head, *tmp;
fd = open("/sys/devices/system/clocksource/clocksource0/available_clocksource", O_RDONLY);
+ if (fd < 0)
+ return 0;
- size = read(fd, buf, 512);
+ size = read(fd, buf, sizeof(buf) - 1);
close(fd);
+ if (size <= 0)
+ return 0;
+
+ buf[size] = '\0';
+
for (i = 0; i < 10; i++)
list[i][0] = '\0';
@@ -74,11 +81,21 @@ int get_clocksources(char list[][30])
int get_cur_clocksource(char *buf, size_t size)
{
+ ssize_t len;
int fd;
fd = open("/sys/devices/system/clocksource/clocksource0/current_clocksource", O_RDONLY);
+ if (fd < 0)
+ return -1;
+
+ len = read(fd, buf, size - 1);
+
+ close(fd);
+
+ if (len <= 0)
+ return -1;
- size = read(fd, buf, size);
+ buf[len] = '\0';
return 0;
}
diff --git a/tools/testing/selftests/timers/posix_timers.c b/tools/testing/selftests/timers/posix_timers.c
index a92d4b957747..52b7289e1450 100644
--- a/tools/testing/selftests/timers/posix_timers.c
+++ b/tools/testing/selftests/timers/posix_timers.c
@@ -113,9 +113,10 @@ static void check_itimer(int which, const char *name)
done = 0;
- if (which == ITIMER_VIRTUAL)
+ if (which == ITIMER_VIRTUAL) {
+ clock_id = CLOCK_THREAD_CPUTIME_ID;
signal(SIGVTALRM, sig_handler);
- else if (which == ITIMER_PROF) {
+ } else if (which == ITIMER_PROF) {
clock_id = CLOCK_THREAD_CPUTIME_ID;
signal(SIGPROF, sig_handler);
}
@@ -148,7 +149,7 @@ static void check_timer_create(int which)
struct itimerspec val = {
.it_value.tv_sec = DELAY,
};
- int clock_id = CLOCK_REALTIME;
+ int clock_id = which;
timer_t id;
done = 0;
diff --git a/tools/testing/selftests/timers/raw_skew.c b/tools/testing/selftests/timers/raw_skew.c
index 0c87a8fb0d7f..dfca3e2d50d2 100644
--- a/tools/testing/selftests/timers/raw_skew.c
+++ b/tools/testing/selftests/timers/raw_skew.c
@@ -91,6 +91,7 @@ int main(int argc, char **argv)
{
struct timespec mon, raw, start, end;
long long delta1, delta2, interval, eppm, ppm;
+ long tick_nom;
struct timex tx1, tx2;
setbuf(stdout, NULL);
@@ -129,6 +130,17 @@ int main(int argc, char **argv)
/* Avg the two actual freq samples adjtimex gave us */
ppm = (long long)(tx1.freq + tx2.freq) * 1000 / 2;
ppm = shift_right(ppm, 16);
+
+ /*
+ * The tick value holds the coarse part of the adjustment, a
+ * microsecond of the tick length per unit, and time sync daemons
+ * do put part of their correction there. What it is worth has to
+ * be counted in as well, or a clock disciplined through it looks
+ * off by a hundred ppm a unit against what the two clocks show.
+ */
+ tick_nom = USEC_PER_SEC / sysconf(_SC_CLK_TCK);
+ ppm += (long long)(tx1.tick + tx2.tick - 2 * tick_nom) *
+ (USEC_PER_SEC / tick_nom) * 1000 / 2;
printf(" %lld.%i(act)", ppm/1000, abs((int)(ppm%1000)));
if (llabs(eppm - ppm) > 1000) {