[RFC PATCH v2 6/8] timekeeping: Guard against divide-by-zero in timekeeping_adjust
From: David Woodhouse
Date: Sun May 17 2026 - 18:06:06 EST
From: David Woodhouse <dwmw@xxxxxxxxxxxx>
When the TSC clocksource is recalibrated (e.g. on KVM guests with
clocksource=tsc), cycle_interval can momentarily be zero during the
transition. Guard the div64_u64 in timekeeping_adjust() to prevent a
divide-by-zero oops.
This can be triggered on KVM guests that force clocksource=tsc when
the host TSC frequency doesn't match what KVM initially reports,
causing a recalibration during boot.
Signed-off-by: David Woodhouse (Kiro) <dwmw@xxxxxxxxxxxx>
---
kernel/time/timekeeping.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 89fed9473c38..1cc98fdda4f8 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -2363,6 +2363,8 @@ static void timekeeping_adjust(struct timekeeper *tk, s64 offset)
if (likely(tk->ntp_tick == ntp_tl)) {
mult = tk->tkr_mono.mult - tk->ntp_err_mult;
} else {
+ if (unlikely(!tk->cycle_interval))
+ return;
tk->ntp_tick = ntp_tl;
mult = div64_u64(tk->ntp_tick >> tk->ntp_error_shift,
tk->cycle_interval);
--
2.51.0