Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751900AbdH3PZR (ORCPT ); Wed, 30 Aug 2017 11:25:17 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:26131 "EHLO relay.sw.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751404AbdH3PZN (ORCPT ); Wed, 30 Aug 2017 11:25:13 -0400 From: Denis Plotnikov To: pbonzini@redhat.com, rkrcmar@redhat.com, kvm@vger.kernel.org, john.stultz@linaro.org, tglx@linutronix.de Cc: mingo@redhat.com, hpa@zytor.com, linux-kernel@vger.kernel.org, x86@kernel.org, rkagan@virtuozzo.com, den@virtuozzo.com Subject: [PATCH v5 3/6] timekeeper: use the extended reading function on snapshot acquiring Date: Wed, 30 Aug 2017 18:23:45 +0300 Message-Id: <1504106628-172372-4-git-send-email-dplotnikov@virtuozzo.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1504106628-172372-1-git-send-email-dplotnikov@virtuozzo.com> References: <1504106628-172372-1-git-send-email-dplotnikov@virtuozzo.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2636 Lines: 72 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 --- 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