Make use of the extended reading function on time snapshot getting: get raw cycles value if extended function is defined. The raw cycles value then is used for KVM masterclock. This is a part of the work aiming to move to a more simple scheme of masterclock related values calculation in KVM Signed-off-by: Denis Plotnikov <dplotnikov@xxxxxxxxxxxxx> --- include/linux/timekeeping.h | 3 +++ kernel/time/timekeeping.c | 13 +++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h index 5008e3e..528d088 100644 --- a/include/linux/timekeeping.h +++ b/include/linux/timekeeping.h @@ -286,6 +286,8 @@ extern void ktime_get_raw_and_real_ts64(struct timespec64 *ts_raw, * @boot: Monotonic time since boot * @clock_was_set_seq: The sequence number of clock was set events * @cs_was_changed_seq: The sequence number of clocksource change events + * @cycles_valid: The flag is true when @cycles contain actual + * number of cycles instead some cycle derivative */ struct system_time_snapshot { u64 cycles; @@ -294,6 +296,7 @@ struct system_time_snapshot { ktime_t boot; unsigned int clock_was_set_seq; u8 cs_was_changed_seq; + bool cycles_valid; }; /* diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 66f7701..d1aa575 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -957,12 +957,22 @@ void ktime_get_snapshot(struct system_time_snapshot *systime_snapshot) u64 nsec_raw; u64 nsec_real; u64 now; + struct clocksource *clock; WARN_ON_ONCE(timekeeping_suspended); do { seq = read_seqcount_begin(&tk_core.seq); - now = tk_clock_read(&tk->tkr_mono); + clock = READ_ONCE(tk->tkr_mono.clock); + if (clock->read_with_stamp) + systime_snapshot->cycles_valid = + clock->read_with_stamp( + clock, &now, &systime_snapshot->cycles); + else { + systime_snapshot->cycles_valid = false; + now = clock->read(clock); + systime_snapshot->cycles = now; + } systime_snapshot->cs_was_changed_seq = tk->cs_was_changed_seq; systime_snapshot->clock_was_set_seq = tk->clock_was_set_seq; base_real = ktime_add(tk->tkr_mono.base, @@ -974,7 +984,6 @@ 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->real = ktime_add_ns(base_real, nsec_real); systime_snapshot->raw = ktime_add_ns(base_raw, nsec_raw); systime_snapshot->boot = ktime_add_ns(base_boot, nsec_real); -- 2.7.4