On 15/10/19 12:48, Jianyong Wu wrote: > Sometimes, we need check current clocksource outside of > timekeeping area. Add clocksource to system_time_snapshot then > we can get clocksource as well as system time. > > Signed-off-by: Jianyong Wu <jianyong.wu@xxxxxxx> > Suggested-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> > --- > include/linux/timekeeping.h | 35 ++++++++++++++++++----------------- > kernel/time/timekeeping.c | 7 ++++--- > 2 files changed, 22 insertions(+), 20 deletions(-) > > diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h > index a8ab0f143ac4..964c14fbbf69 100644 > --- a/include/linux/timekeeping.h > +++ b/include/linux/timekeeping.h > @@ -194,23 +194,6 @@ extern bool timekeeping_rtc_skipresume(void); > > extern void timekeeping_inject_sleeptime64(const struct timespec64 *delta); > > -/* > - * struct system_time_snapshot - simultaneous raw/real time capture with > - * counter value > - * @cycles: Clocksource counter value to produce the system times > - * @real: Realtime system time > - * @raw: Monotonic raw system time > - * @clock_was_set_seq: The sequence number of clock was set events > - * @cs_was_changed_seq: The sequence number of clocksource change events > - */ > -struct system_time_snapshot { > - u64 cycles; > - ktime_t real; > - ktime_t raw; > - unsigned int clock_was_set_seq; > - u8 cs_was_changed_seq; > -}; > - > /* > * struct system_device_crosststamp - system/device cross-timestamp > * (syncronized capture) > @@ -236,6 +219,24 @@ struct system_counterval_t { > struct clocksource *cs; > }; > > +/* > + * struct system_time_snapshot - simultaneous raw/real time capture with > + * counter value > + * @sc: Contains clocksource and clocksource counter value to produce > + * the system times > + * @real: Realtime system time > + * @raw: Monotonic raw system time > + * @clock_was_set_seq: The sequence number of clock was set events > + * @cs_was_changed_seq: The sequence number of clocksource change events > + */ > +struct system_time_snapshot { > + struct system_counterval_t sc; > + ktime_t real; > + ktime_t raw; > + unsigned int clock_was_set_seq; > + u8 cs_was_changed_seq; > +}; > + > /* > * Get cross timestamp between system clock and device clock > */ > diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c > index 44b726bab4bd..66ff089605b3 100644 > --- a/kernel/time/timekeeping.c > +++ b/kernel/time/timekeeping.c > @@ -983,7 +983,8 @@ void ktime_get_snapshot(struct system_time_snapshot *systime_snapshot) > nsec_raw = timekeeping_cycles_to_ns(&tk->tkr_raw, now); > } while (read_seqcount_retry(&tk_core.seq, seq)); > > - systime_snapshot->cycles = now; > + systime_snapshot->sc.cycles = now; > + systime_snapshot->sc.cs = tk->tkr_mono.clock; > systime_snapshot->real = ktime_add_ns(base_real, nsec_real); > systime_snapshot->raw = ktime_add_ns(base_raw, nsec_raw); > } > @@ -1189,12 +1190,12 @@ int get_device_system_crosststamp(int (*get_time_fn) > * clocksource change > */ > if (!history_begin || > - !cycle_between(history_begin->cycles, > + !cycle_between(history_begin->sc.cycles, > system_counterval.cycles, cycles) || > history_begin->cs_was_changed_seq != cs_was_changed_seq) > return -EINVAL; > partial_history_cycles = cycles - system_counterval.cycles; > - total_history_cycles = cycles - history_begin->cycles; > + total_history_cycles = cycles - history_begin->sc.cycles; > discontinuity = > history_begin->clock_was_set_seq != clock_was_set_seq; > > Reviewed-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm