Skip to content

Commit

Permalink
timekeeping: Rework timekeeping_inject_sleeptime64() to use shadow_ti…
Browse files Browse the repository at this point in the history
…mekeeper

Updates of the timekeeper can be done by operating on the shadow timekeeper
and afterwards copying the result into the real timekeeper. This has the
advantage, that the sequence count write protected region is kept as small
as possible.

Convert timekeeping_inject_sleeptime64() to use this scheme.

Signed-off-by: Anna-Maria Behnsen <[email protected]>
Signed-off-by: Thomas Gleixner <[email protected]>
Acked-by: John Stultz <[email protected]>
Link: https://lore.kernel.org/all/20241009-devel-anna-maria-b4-timers-ptp-timekeeping-v2-20-554456a44a15@linutronix.de
  • Loading branch information
anna-marialx authored and KAGA-KOKO committed Oct 25, 2024
1 parent 2cab490 commit 2b473e6
Showing 1 changed file with 7 additions and 15 deletions.
22 changes: 7 additions & 15 deletions kernel/time/timekeeping.c
Original file line number Diff line number Diff line change
Expand Up @@ -1924,22 +1924,14 @@ bool timekeeping_rtc_skipsuspend(void)
*/
void timekeeping_inject_sleeptime64(const struct timespec64 *delta)
{
struct timekeeper *tk = &tk_core.timekeeper;
unsigned long flags;

raw_spin_lock_irqsave(&tk_core.lock, flags);
write_seqcount_begin(&tk_core.seq);

suspend_timing_needed = false;

timekeeping_forward_now(tk);

__timekeeping_inject_sleeptime(tk, delta);

timekeeping_update(&tk_core, tk, TK_UPDATE_ALL | TK_MIRROR);
scoped_guard(raw_spinlock_irqsave, &tk_core.lock) {
struct timekeeper *tks = &tk_core.shadow_timekeeper;

write_seqcount_end(&tk_core.seq);
raw_spin_unlock_irqrestore(&tk_core.lock, flags);
suspend_timing_needed = false;
timekeeping_forward_now(tks);
__timekeeping_inject_sleeptime(tks, delta);
timekeeping_update_from_shadow(&tk_core, TK_UPDATE_ALL);
}

/* Signal hrtimers about time change */
clock_was_set(CLOCK_SET_WALL | CLOCK_SET_BOOT);
Expand Down

0 comments on commit 2b473e6

Please sign in to comment.