]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
timekeeping: Introduce timekeeper ID
authorAnna-Maria Behnsen <anna-maria@linutronix.de>
Mon, 19 May 2025 08:33:19 +0000 (10:33 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 19 Jun 2025 12:28:22 +0000 (14:28 +0200)
As long as there is only a single timekeeper, there is no need to clarify
which timekeeper is used. But with the upcoming reusage of the timekeeper
infrastructure for auxiliary clock timekeepers, an ID is required to
differentiate.

Introduce an enum for timekeeper IDs, introduce a field in struct tk_data
to store this timekeeper id and add also initialization. The id struct
field is added at the end of the second cachline, as there is a 4 byte hole
anyway.

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

index 785048a3b3e60478813c26b58decb082ae4015d6..bfcecad0e2798fcf972686673b1d99039d489e2f 100644 (file)
 #include <linux/jiffies.h>
 #include <linux/time.h>
 
+/**
+ * timekeeper_ids - IDs for various time keepers in the kernel
+ * @TIMEKEEPER_CORE:   The central core timekeeper managing system time
+ * @TIMEKEEPERS_MAX:   The maximum number of timekeepers managed
+ */
+enum timekeeper_ids {
+       TIMEKEEPER_CORE,
+       TIMEKEEPERS_MAX,
+};
+
 /**
  * struct tk_read_base - base structure for timekeeping readout
  * @clock:     Current clocksource used for timekeeping.
@@ -52,6 +62,7 @@ struct tk_read_base {
  * @offs_boot:                 Offset clock monotonic -> clock boottime
  * @offs_tai:                  Offset clock monotonic -> clock tai
  * @coarse_nsec:               The nanoseconds part for coarse time getters
+ * @id:                                The timekeeper ID
  * @tkr_raw:                   The readout base structure for CLOCK_MONOTONIC_RAW
  * @raw_sec:                   CLOCK_MONOTONIC_RAW  time in seconds
  * @clock_was_set_seq:         The sequence number of clock was set events
@@ -101,7 +112,7 @@ struct tk_read_base {
  * which results in the following cacheline layout:
  *
  * 0:  seqcount, tkr_mono
- * 1:  xtime_sec ... coarse_nsec
+ * 1:  xtime_sec ... id
  * 2:  tkr_raw, raw_sec
  * 3,4: Internal variables
  *
@@ -123,6 +134,7 @@ struct timekeeper {
        ktime_t                 offs_boot;
        ktime_t                 offs_tai;
        u32                     coarse_nsec;
+       enum timekeeper_ids     id;
 
        /* Cacheline 2: */
        struct tk_read_base     tkr_raw;
index fb1da87a92f1ad39e06f45635620fc35e277ca3d..f4692fc2ea6b5913fc76a6cac7c6ff820fa92a6d 100644 (file)
@@ -1663,10 +1663,11 @@ 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)
+static __init void tkd_basic_setup(struct tk_data *tkd, enum timekeeper_ids tk_id)
 {
        raw_spin_lock_init(&tkd->lock);
        seqcount_raw_spinlock_init(&tkd->seq, &tkd->lock);
+       tkd->timekeeper.id = tkd->shadow_timekeeper.id = tk_id;
 }
 
 /*
@@ -1696,7 +1697,7 @@ void __init timekeeping_init(void)
        struct timekeeper *tks = &tk_core.shadow_timekeeper;
        struct clocksource *clock;
 
-       tkd_basic_setup(&tk_core);
+       tkd_basic_setup(&tk_core, TIMEKEEPER_CORE);
 
        read_persistent_wall_and_boot_offset(&wall_time, &boot_offset);
        if (timespec64_valid_settod(&wall_time) &&