mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
timekeeping: Provide update for auxiliary timekeepers
Update the auxiliary timekeepers periodically. For now this is tied to the system timekeeper update from the tick. This might be revisited and moved out of the tick. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: John Stultz <jstultz@google.com> Link: https://lore.kernel.org/all/20250625183758.382451331@linutronix.de
This commit is contained in:
parent
ecf3e70304
commit
e6d4c00719
|
|
@ -131,9 +131,11 @@ static struct tk_fast tk_fast_raw ____cacheline_aligned = {
|
|||
#ifdef CONFIG_POSIX_AUX_CLOCKS
|
||||
static __init void tk_aux_setup(void);
|
||||
static void tk_aux_update_clocksource(void);
|
||||
static void tk_aux_advance(void);
|
||||
#else
|
||||
static inline void tk_aux_setup(void) { }
|
||||
static inline void tk_aux_update_clocksource(void) { }
|
||||
static inline void tk_aux_advance(void) { }
|
||||
#endif
|
||||
|
||||
unsigned long timekeeper_lock_irqsave(void)
|
||||
|
|
@ -2317,11 +2319,13 @@ static bool timekeeping_advance(enum timekeeping_adv_mode mode)
|
|||
/**
|
||||
* update_wall_time - Uses the current clocksource to increment the wall time
|
||||
*
|
||||
* It also updates the enabled auxiliary clock timekeepers
|
||||
*/
|
||||
void update_wall_time(void)
|
||||
{
|
||||
if (timekeeping_advance(TK_ADV_TICK))
|
||||
clock_was_set_delayed();
|
||||
tk_aux_advance();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -2764,6 +2768,21 @@ static void tk_aux_update_clocksource(void)
|
|||
}
|
||||
}
|
||||
|
||||
static void tk_aux_advance(void)
|
||||
{
|
||||
unsigned long active = READ_ONCE(aux_timekeepers);
|
||||
unsigned int id;
|
||||
|
||||
/* Lockless quick check to avoid extra cache lines */
|
||||
for_each_set_bit(id, &active, BITS_PER_LONG) {
|
||||
struct tk_data *aux_tkd = &timekeeper_data[id + TIMEKEEPER_AUX_FIRST];
|
||||
|
||||
guard(raw_spinlock)(&aux_tkd->lock);
|
||||
if (aux_tkd->shadow_timekeeper.clock_valid)
|
||||
__timekeeping_advance(aux_tkd, TK_ADV_TICK);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ktime_get_aux - Get time for a AUX clock
|
||||
* @id: ID of the clock to read (CLOCK_AUX...)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user