Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1558326
| From | Marcelo Tosatti <mtosatti@redhat.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [patch 1/3] KVM: x86: provide realtime host clock via vsyscall notifiers |
| Date | 2017-01-13 13:10 +0100 |
| Message-ID | <sZ8Qc-HA-83@gated-at.bofh.it> (permalink) |
| References | <sZ8Qc-HA-85@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
Expose the realtime host clock and save the TSC value
used for the clock calculation.
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
---
arch/x86/kvm/x86.c | 38 ++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+)
Index: kvm-ptpdriver/arch/x86/kvm/x86.c
===================================================================
--- kvm-ptpdriver.orig/arch/x86/kvm/x86.c 2017-01-13 08:59:03.015895353 -0200
+++ kvm-ptpdriver/arch/x86/kvm/x86.c 2017-01-13 09:04:46.581415259 -0200
@@ -1139,6 +1139,8 @@
u64 boot_ns;
u64 nsec_base;
+ u64 wall_time_sec;
+ u64 wall_time_snsec;
};
static struct pvclock_gtod_data pvclock_gtod_data;
@@ -1162,6 +1164,9 @@
vdata->boot_ns = boot_ns;
vdata->nsec_base = tk->tkr_mono.xtime_nsec;
+ vdata->wall_time_sec = tk->xtime_sec;
+ vdata->wall_time_snsec = tk->tkr_mono.xtime_nsec;
+
write_seqcount_end(&vdata->seq);
}
#endif
@@ -1623,6 +1628,28 @@
return mode;
}
+static int do_realtime(struct timespec *ts, cycle_t *cycle_now)
+{
+ struct pvclock_gtod_data *gtod = &pvclock_gtod_data;
+ unsigned long seq;
+ int mode;
+ u64 ns;
+
+ do {
+ seq = read_seqcount_begin(>od->seq);
+ mode = gtod->clock.vclock_mode;
+ ts->tv_sec = gtod->wall_time_sec;
+ ns = gtod->wall_time_snsec;
+ ns += vgettsc(cycle_now);
+ ns >>= gtod->clock.shift;
+ } while (unlikely(read_seqcount_retry(>od->seq, seq)));
+
+ ts->tv_sec += __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns);
+ ts->tv_nsec = ns;
+
+ return mode;
+}
+
/* returns true if host is using tsc clocksource */
static bool kvm_get_time_and_clockread(s64 *kernel_ns, cycle_t *cycle_now)
{
@@ -1632,6 +1659,17 @@
return do_monotonic_boot(kernel_ns, cycle_now) == VCLOCK_TSC;
}
+
+/* returns true if host is using tsc clocksource */
+static bool kvm_get_walltime_and_clockread(struct timespec *ts,
+ cycle_t *cycle_now)
+{
+ /* checked again under seqlock below */
+ if (pvclock_gtod_data.clock.vclock_mode != VCLOCK_TSC)
+ return false;
+
+ return do_realtime(ts, cycle_now) == VCLOCK_TSC;
+}
#endif
/*
Back to linux.kernel | Previous | Next — Next in thread | Find similar | Unroll thread
[patch 1/3] KVM: x86: provide realtime host clock via vsyscall notifiers Marcelo Tosatti <mtosatti@redhat.com> - 2017-01-13 13:10 +0100
Re: [patch 1/3] KVM: x86: provide realtime host clock via vsyscall notifiers Radim Krcmar <rkrcmar@redhat.com> - 2017-01-13 16:20 +0100
Re: [patch 1/3] KVM: x86: provide realtime host clock via vsyscall notifiers Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> - 2017-01-13 16:50 +0100
Re: [patch 1/3] KVM: x86: provide realtime host clock via vsyscall notifiers Marcelo Tosatti <mtosatti@redhat.com> - 2017-01-13 17:00 +0100
Re: [patch 1/3] KVM: x86: provide realtime host clock via vsyscall notifiers Marcelo Tosatti <mtosatti@redhat.com> - 2017-01-13 17:10 +0100
Re: [patch 1/3] KVM: x86: provide realtime host clock via vsyscall notifiers Radim Krcmar <rkrcmar@redhat.com> - 2017-01-13 17:30 +0100
Re: [patch 1/3] KVM: x86: provide realtime host clock via vsyscall notifiers Marcelo Tosatti <mtosatti@redhat.com> - 2017-01-13 19:10 +0100
Re: [patch 1/3] KVM: x86: provide realtime host clock via vsyscall notifiers Radim Krcmar <rkrcmar@redhat.com> - 2017-01-16 16:50 +0100
csiph-web