[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20240907190900.55421-1-dev@benjarobin.fr>
Date: Sat, 7 Sep 2024 21:09:00 +0200
From: Benjamin ROBIN <dev@...jarobin.fr>
To: jstultz@...gle.com,
tglx@...utronix.de
Cc: sboyd@...nel.org,
linux-kernel@...r.kernel.org,
Benjamin ROBIN <dev@...jarobin.fr>
Subject: [PATCH] ntp: Make sure RTC is synchronized when time goes backwards
The "sync_hw_clock" is normally called every 11 minutes when time is
synchronized. This issue is that this periodic timer uses the REALTIME
clock, so when time moves backwards (the NTP server jumps into the past),
the next call to "sync_hw_clock" could be realized after a very long
period.
A normal NTP server should not jump in the past like that, but it is
possible... Another way to reproduce this issue is using phc2sys to
synchronize the REALTIME clock with for example an IRIG timecode with
the source always starting at the same date (not synchronized).
This patch cancels the periodic timer on a time jump (ADJ_SETOFFSET).
The timer will be relaunched at the end of "do_adjtimex" if NTP is still
considered synced. Otherwise the timer will be relaunched later when NTP
is synced. This way, when the time is synchronized again, the RTC is
updated after less than 2 seconds.
Signed-off-by: Benjamin ROBIN <dev@...jarobin.fr>
---
kernel/time/ntp.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
index 8d2dd214ec68..5c8dd92cf012 100644
--- a/kernel/time/ntp.c
+++ b/kernel/time/ntp.c
@@ -751,6 +751,9 @@ static inline void process_adjtimex_modes(const struct __kernel_timex *txc,
if (txc->modes & (ADJ_TICK|ADJ_FREQUENCY|ADJ_OFFSET))
ntp_update_frequency();
+
+ if (txc->modes & ADJ_SETOFFSET)
+ hrtimer_cancel(&sync_hrtimer);
}
--
2.45.2
Powered by blists - more mailing lists