]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
timekeeping: Add clock_valid flag to timekeeper
authorThomas Gleixner <tglx@linutronix.de>
Mon, 19 May 2025 08:33:27 +0000 (10:33 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 19 Jun 2025 12:28:23 +0000 (14:28 +0200)
In preparation for supporting independent auxiliary timekeepers, add a
clock valid field and set it to true for the system timekeeper.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: John Stultz <jstultz@google.com>
Link: https://lore.kernel.org/all/20250519083026.287145536@linutronix.de
include/linux/timekeeper_internal.h
kernel/time/timekeeping.c

index 4201ae818f5704c5a598f074d5b52e263b3a54be..1690eda1c7c3066d317c22bea07600d387553ff6 100644 (file)
@@ -73,6 +73,7 @@ struct tk_read_base {
  * @raw_sec:                   CLOCK_MONOTONIC_RAW  time in seconds
  * @clock_was_set_seq:         The sequence number of clock was set events
  * @cs_was_changed_seq:                The sequence number of clocksource change events
+ * @clock_valid:               Indicator for valid clock
  * @monotonic_to_boot:         CLOCK_MONOTONIC to CLOCK_BOOTTIME offset
  * @cycle_interval:            Number of clock cycles in one NTP interval
  * @xtime_interval:            Number of clock shifted nano seconds in one NTP
@@ -149,6 +150,7 @@ struct timekeeper {
        /* Cachline 3 and 4 (timekeeping internal variables): */
        unsigned int            clock_was_set_seq;
        u8                      cs_was_changed_seq;
+       u8                      clock_valid;
 
        struct timespec64       monotonic_to_boot;
 
index e3c1a1c1d8c59fb2298e0cd0edbca64f66a36b18..bf59bacc97db76600f26c61467f1488e2b08d7cf 100644 (file)
@@ -1665,11 +1665,12 @@ read_persistent_wall_and_boot_offset(struct timespec64 *wall_time,
        *boot_offset = ns_to_timespec64(local_clock());
 }
 
-static __init void tkd_basic_setup(struct tk_data *tkd, enum timekeeper_ids tk_id)
+static __init void tkd_basic_setup(struct tk_data *tkd, enum timekeeper_ids tk_id, bool valid)
 {
        raw_spin_lock_init(&tkd->lock);
        seqcount_raw_spinlock_init(&tkd->seq, &tkd->lock);
        tkd->timekeeper.id = tkd->shadow_timekeeper.id = tk_id;
+       tkd->timekeeper.clock_valid = tkd->shadow_timekeeper.clock_valid = valid;
 }
 
 /*
@@ -1699,7 +1700,7 @@ void __init timekeeping_init(void)
        struct timekeeper *tks = &tk_core.shadow_timekeeper;
        struct clocksource *clock;
 
-       tkd_basic_setup(&tk_core, TIMEKEEPER_CORE);
+       tkd_basic_setup(&tk_core, TIMEKEEPER_CORE, true);
 
        read_persistent_wall_and_boot_offset(&wall_time, &boot_offset);
        if (timespec64_valid_settod(&wall_time) &&