timekeeping: Introduce timekeeper ID
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
This commit is contained in:
committed by
Thomas Gleixner
parent
7e55b6ba1f
commit
f12b45862c
@@ -11,6 +11,16 @@
|
||||
#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;
|
||||
|
||||
@@ -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) &&
|
||||
|
||||
Reference in New Issue
Block a user