On Thu, Aug 22, 2024 at 10:13:34AM +0100, Marc Zyngier wrote: > On Mon, 05 Aug 2024 18:32:27 +0100, > Vincent Donnefort <[email protected]> wrote: > > > > On arm64 systems, the arch timer can be accessible by both EL1 and EL2. > > This means when running with nVHE or protected KVM, it is easy to > > generate clock values from the hypervisor, synchronized with the kernel. > > When you say "arch_timer" here, are you talking about the data > structure describing the timer? Or about the actual *counter*, a > system register provided by the HW? > > I'm not sure the architecture-specific details are massively relevant, > given that this is an arch-agnostic change.
I meant the counter but happy to drop this entire paragraph and just keep the following one! > > > > > For tracing purpose, the boot clock is interesting as it doesn't stop on > > suspend. Export it as part of the time snapshot. This will later allow > > the hypervisor to add boot clock timestamps to its events. > > Isn't that the actual description of the change? By getting the boot > time as well as the parameters to compute an increment, you allow any > subsystem able to perform a snapshot to compute a delta from boot time > as long as they have access to the counter source. > > > > > Signed-off-by: Vincent Donnefort <[email protected]> > > > > diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h > > index fc12a9ba2c88..0fc6a61d64bd 100644 > > --- a/include/linux/timekeeping.h > > +++ b/include/linux/timekeeping.h > > @@ -275,18 +275,24 @@ struct ktime_timestamps { > > * counter value > > * @cycles: Clocksource counter value to produce the system times > > * @real: Realtime system time > > + * @boot: Boot time > > * @raw: Monotonic raw system time > > * @cs_id: Clocksource ID > > * @clock_was_set_seq: The sequence number of clock-was-set events > > * @cs_was_changed_seq: The sequence number of clocksource change events > > + * @mono_shift: The monotonic clock slope shift > > + * @mono_mult: The monotonic clock slope mult > > */ > > struct system_time_snapshot { > > u64 cycles; > > ktime_t real; > > + ktime_t boot; > > ktime_t raw; > > enum clocksource_ids cs_id; > > unsigned int clock_was_set_seq; > > u8 cs_was_changed_seq; > > + u32 mono_shift; > > + u32 mono_mult; > > }; > > > > /** > > diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c > > index 2fa87dcfeda9..6d0488a555a7 100644 > > --- a/kernel/time/timekeeping.c > > +++ b/kernel/time/timekeeping.c > > @@ -1057,9 +1057,11 @@ noinstr time64_t __ktime_get_real_seconds(void) > > void ktime_get_snapshot(struct system_time_snapshot *systime_snapshot) > > { > > struct timekeeper *tk = &tk_core.timekeeper; > > + u32 mono_mult, mono_shift; > > unsigned int seq; > > ktime_t base_raw; > > ktime_t base_real; > > + ktime_t base_boot; > > u64 nsec_raw; > > u64 nsec_real; > > u64 now; > > @@ -1074,14 +1076,21 @@ void ktime_get_snapshot(struct system_time_snapshot > > *systime_snapshot) > > systime_snapshot->clock_was_set_seq = tk->clock_was_set_seq; > > base_real = ktime_add(tk->tkr_mono.base, > > tk_core.timekeeper.offs_real); > > + base_boot = ktime_add(tk->tkr_mono.base, > > + tk_core.timekeeper.offs_boot); > > base_raw = tk->tkr_raw.base; > > nsec_real = timekeeping_cycles_to_ns(&tk->tkr_mono, now); > > nsec_raw = timekeeping_cycles_to_ns(&tk->tkr_raw, now); > > + mono_mult = tk->tkr_mono.mult; > > + mono_shift = tk->tkr_mono.shift; > > } while (read_seqcount_retry(&tk_core.seq, seq)); > > > > systime_snapshot->cycles = now; > > systime_snapshot->real = ktime_add_ns(base_real, nsec_real); > > + systime_snapshot->boot = ktime_add_ns(base_boot, nsec_real); > > systime_snapshot->raw = ktime_add_ns(base_raw, nsec_raw); > > + systime_snapshot->mono_shift = mono_shift; > > + systime_snapshot->mono_mult = mono_mult; > > } > > EXPORT_SYMBOL_GPL(ktime_get_snapshot); > > > > This looks good to me, but you should probably Cc the timekeeping > maintainers (tglx, John Stultz, and Stephen Boyd). Yep, my bad! > > Thanks, > > M. > > -- > Without deviation from the norm, progress is not possible.
