]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
hrtimer: Store time as ktime_t in restart block
authorThomas Weißschuh <thomas.weissschuh@linutronix.de>
Mon, 10 Nov 2025 09:38:53 +0000 (10:38 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 14 Nov 2025 15:31:19 +0000 (16:31 +0100)
The hrtimer core uses ktime_t to represent times, use that also for the
restart block. CPU timers internally use nanoseconds instead of ktime_t
but use the same restart block, so use the correct accessors for those.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://patch.msgid.link/20251110-restart-block-expiration-v1-3-5d39cc93df4f@linutronix.de
include/linux/restart_block.h
kernel/time/hrtimer.c
kernel/time/posix-cpu-timers.c

index 7e50bbc94e476c599eb1185e02b6e87854fc3eb8..36ddfa1ec3010e74b6c25ef27f5ca15ec01a7bdc 100644 (file)
@@ -43,7 +43,7 @@ struct restart_block {
                                struct __kernel_timespec __user *rmtp;
                                struct old_timespec32 __user *compat_rmtp;
                        };
-                       u64 expires;
+                       ktime_t expires;
                } nanosleep;
                /* For poll */
                struct {
index 7e7b2b471baec27b25ec33d634dc106efe7b608a..9c77e5c725567b12e5886b0b15479cec279b6645 100644 (file)
@@ -2145,7 +2145,7 @@ static long __sched hrtimer_nanosleep_restart(struct restart_block *restart)
        int ret;
 
        hrtimer_setup_sleeper_on_stack(&t, restart->nanosleep.clockid, HRTIMER_MODE_ABS);
-       hrtimer_set_expires_tv64(&t.timer, restart->nanosleep.expires);
+       hrtimer_set_expires(&t.timer, restart->nanosleep.expires);
        ret = do_nanosleep(&t, HRTIMER_MODE_ABS);
        destroy_hrtimer_on_stack(&t.timer);
        return ret;
@@ -2172,7 +2172,7 @@ long hrtimer_nanosleep(ktime_t rqtp, const enum hrtimer_mode mode,
 
        restart = &current->restart_block;
        restart->nanosleep.clockid = t.timer.base->clockid;
-       restart->nanosleep.expires = hrtimer_get_expires_tv64(&t.timer);
+       restart->nanosleep.expires = hrtimer_get_expires(&t.timer);
        set_restart_fn(restart, hrtimer_nanosleep_restart);
 out:
        destroy_hrtimer_on_stack(&t.timer);
index 2e5b89d7d8660585460490557021dfbf7799740d..0de2bb7cbec01c423fc98e78c5a0aeb5c910381d 100644 (file)
@@ -1557,7 +1557,7 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
                 * Report back to the user the time still remaining.
                 */
                restart = &current->restart_block;
-               restart->nanosleep.expires = expires;
+               restart->nanosleep.expires = ns_to_ktime(expires);
                if (restart->nanosleep.type != TT_NONE)
                        error = nanosleep_copyout(restart, &it.it_value);
        }
@@ -1599,7 +1599,7 @@ static long posix_cpu_nsleep_restart(struct restart_block *restart_block)
        clockid_t which_clock = restart_block->nanosleep.clockid;
        struct timespec64 t;
 
-       t = ns_to_timespec64(restart_block->nanosleep.expires);
+       t = ktime_to_timespec64(restart_block->nanosleep.expires);
 
        return do_cpu_nanosleep(which_clock, TIMER_ABSTIME, &t);
 }