* [PATCHv2 0/2] xen: maintain an accurate persistent clock in more cases @ 2013-05-28 18:22 David Vrabel 2013-05-28 18:22 ` [PATCH 1/2] x86/xen: sync the CMOS RTC as well as the Xen wallclock David Vrabel 2013-05-28 18:22 ` [PATCH 2/2] x86/xen: sync the wallclock when the system time changes David Vrabel 0 siblings, 2 replies; 14+ messages in thread From: David Vrabel @ 2013-05-28 18:22 UTC (permalink / raw) To: xen-devel; +Cc: David Vrabel, Konrad Rzeszutek Wilk, John Stultz, linux-kernel The kernel has limited support for updating the persistent clock or RTC when NTP is synced. This has the following limitations: * The persistent clock is not updated on step changes. This leaves a window where it will be incorrect (while NTP resyncs). * Xen guests use the Xen wallclock as their persistent clock. dom0 maintains this clock so it is persistent for domUs and not dom0 itself. These series fixes the above limitations and depends on "x86: increase precision of x86_platform.get/set_wallclock()" which was previously posted. Changes since v1: Reworked to use the pvclock_gtod notifier to sync the wallclock (this looked similar to what a KVM host does). update_persistent_clock() will now only update the CMOS RTC. David [1] http://lists.xen.org/archives/html/xen-devel/2013-05/msg01402.html ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/2] x86/xen: sync the CMOS RTC as well as the Xen wallclock 2013-05-28 18:22 [PATCHv2 0/2] xen: maintain an accurate persistent clock in more cases David Vrabel @ 2013-05-28 18:22 ` David Vrabel 2013-05-28 19:01 ` John Stultz 2013-05-28 18:22 ` [PATCH 2/2] x86/xen: sync the wallclock when the system time changes David Vrabel 1 sibling, 1 reply; 14+ messages in thread From: David Vrabel @ 2013-05-28 18:22 UTC (permalink / raw) To: xen-devel; +Cc: David Vrabel, Konrad Rzeszutek Wilk, John Stultz, linux-kernel From: David Vrabel <david.vrabel@citrix.com> Adjustments to Xen's persistent_clock via update_persistent_clock() don't actually persist, as the xen_set_walltime() just notifies other domN guests that it has been updated, and does not modify the underlying CMOS clock. Thus, this patch modifies xen_set_wallclock() so it will set the underlying CMOS clock when called from dom0, ensuring the persistent_clock will be correct on the next hardware boot. Dom0 does not support accessing EFI runtime services and Xen does not run on Moorsetown platforms so the CMOS RTC is the only supported hardware clock. Signed-off-by: David Vrabel <david.vrabel@citrix.com> Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> --- arch/x86/xen/time.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-) diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index a1947ac..4656165 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c @@ -14,6 +14,7 @@ #include <linux/kernel_stat.h> #include <linux/math64.h> #include <linux/gfp.h> +#include <linux/mc146818rtc.h> #include <asm/pvclock.h> #include <asm/xen/hypervisor.h> @@ -199,17 +200,25 @@ static void xen_get_wallclock(struct timespec *now) static int xen_set_wallclock(const struct timespec *now) { struct xen_platform_op op; + int ret; /* do nothing for domU */ if (!xen_initial_domain()) return -1; + /* Set the Xen wallclock. */ op.cmd = XENPF_settime; op.u.settime.secs = now->tv_sec; op.u.settime.nsecs = now->tv_nsec; op.u.settime.system_time = xen_clocksource_read(); - return HYPERVISOR_dom0_op(&op); + ret = HYPERVISOR_dom0_op(&op); + if (ret) + return ret; + + /* Set the hardware RTC. */ + return mach_set_rtc_mmss(now); + } static struct clocksource xen_clocksource __read_mostly = { -- 1.7.2.5 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] x86/xen: sync the CMOS RTC as well as the Xen wallclock 2013-05-28 18:22 ` [PATCH 1/2] x86/xen: sync the CMOS RTC as well as the Xen wallclock David Vrabel @ 2013-05-28 19:01 ` John Stultz 2013-05-28 19:05 ` Konrad Rzeszutek Wilk 0 siblings, 1 reply; 14+ messages in thread From: John Stultz @ 2013-05-28 19:01 UTC (permalink / raw) To: David Vrabel; +Cc: xen-devel, Konrad Rzeszutek Wilk, linux-kernel On 05/28/2013 11:22 AM, David Vrabel wrote: > From: David Vrabel <david.vrabel@citrix.com> > > Adjustments to Xen's persistent_clock via update_persistent_clock() > don't actually persist, as the xen_set_walltime() just notifies other > domN guests that it has been updated, and does not modify the > underlying CMOS clock. > > Thus, this patch modifies xen_set_wallclock() so it will set the > underlying CMOS clock when called from dom0, ensuring the > persistent_clock will be correct on the next hardware boot. > > Dom0 does not support accessing EFI runtime services and Xen does not > run on Moorsetown platforms so the CMOS RTC is the only supported > hardware clock. > > Signed-off-by: David Vrabel <david.vrabel@citrix.com> > Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Ok, I've queued this for 3.11. thanks -john ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] x86/xen: sync the CMOS RTC as well as the Xen wallclock 2013-05-28 19:01 ` John Stultz @ 2013-05-28 19:05 ` Konrad Rzeszutek Wilk 0 siblings, 0 replies; 14+ messages in thread From: Konrad Rzeszutek Wilk @ 2013-05-28 19:05 UTC (permalink / raw) To: John Stultz; +Cc: David Vrabel, xen-devel, linux-kernel On Tue, May 28, 2013 at 12:01:57PM -0700, John Stultz wrote: > On 05/28/2013 11:22 AM, David Vrabel wrote: > >From: David Vrabel <david.vrabel@citrix.com> > > > >Adjustments to Xen's persistent_clock via update_persistent_clock() > >don't actually persist, as the xen_set_walltime() just notifies other > >domN guests that it has been updated, and does not modify the > >underlying CMOS clock. > > > >Thus, this patch modifies xen_set_wallclock() so it will set the > >underlying CMOS clock when called from dom0, ensuring the > >persistent_clock will be correct on the next hardware boot. > > > >Dom0 does not support accessing EFI runtime services and Xen does not > >run on Moorsetown platforms so the CMOS RTC is the only supported > >hardware clock. > > > >Signed-off-by: David Vrabel <david.vrabel@citrix.com> > >Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> > > Ok, I've queued this for 3.11. Thanks. > > thanks > -john > ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 2/2] x86/xen: sync the wallclock when the system time changes 2013-05-28 18:22 [PATCHv2 0/2] xen: maintain an accurate persistent clock in more cases David Vrabel 2013-05-28 18:22 ` [PATCH 1/2] x86/xen: sync the CMOS RTC as well as the Xen wallclock David Vrabel @ 2013-05-28 18:22 ` David Vrabel 2013-05-28 18:53 ` John Stultz ` (2 more replies) 1 sibling, 3 replies; 14+ messages in thread From: David Vrabel @ 2013-05-28 18:22 UTC (permalink / raw) To: xen-devel; +Cc: David Vrabel, Konrad Rzeszutek Wilk, John Stultz, linux-kernel From: David Vrabel <david.vrabel@citrix.com> Currently the Xen wallclock is only updated every 11 minutes if NTP is synchronized to its clock source. If a guest is started before NTP is synchronized it may see an incorrect wallclock time. Use the pvclock_gtod notifier chain to receive a notification when the system time has changed and update the wallclock to match. This chain is called on every timer tick and we want to avoid an extra (expensive) hypercall on every tick. Because dom0 has historically never provided a very accurate wallclock and guests do not expect one, we can do this simply. The wallclock is only updated if the difference between now and the last update is more than 0.5 s. Signed-off-by: David Vrabel <david.vrabel@citrix.com> --- arch/x86/xen/time.c | 54 ++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 45 insertions(+), 9 deletions(-) diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index 4656165..81027b5 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c @@ -15,6 +15,8 @@ #include <linux/math64.h> #include <linux/gfp.h> #include <linux/mc146818rtc.h> +#include <linux/timekeeper_internal.h> +#include <linux/pvclock_gtod.h> #include <asm/pvclock.h> #include <asm/xen/hypervisor.h> @@ -199,28 +201,59 @@ static void xen_get_wallclock(struct timespec *now) static int xen_set_wallclock(const struct timespec *now) { - struct xen_platform_op op; - int ret; - /* do nothing for domU */ if (!xen_initial_domain()) return -1; - /* Set the Xen wallclock. */ + /* Set the hardware RTC. */ + return mach_set_rtc_mmss(now); + +} + +static int xen_pvclock_gtod_notify(struct notifier_block *nb, unsigned long unused, + void *priv) +{ + static struct timespec last, next; + struct timespec now; + struct timekeeper *tk = priv; + struct xen_platform_op op; + int ret; + + /* + * Set the Xen wallclock from Linux system time. + * + * dom0 hasn't historically maintained a very accurate + * wallclock so guests don't expect it. We can therefore + * reduce the number of expensive hypercalls by only updating + * the wallclock every 0.5 s. + */ + + now.tv_sec = tk->xtime_sec; + now.tv_nsec = tk->xtime_nsec >> tk->shift; + + if (timespec_compare(&now, &last) > 0 + && timespec_compare(&now, &next) < 0) + return 0; + op.cmd = XENPF_settime; - op.u.settime.secs = now->tv_sec; - op.u.settime.nsecs = now->tv_nsec; + op.u.settime.secs = now.tv_sec; + op.u.settime.nsecs = now.tv_nsec; op.u.settime.system_time = xen_clocksource_read(); ret = HYPERVISOR_dom0_op(&op); if (ret) - return ret; + return 0; - /* Set the hardware RTC. */ - return mach_set_rtc_mmss(now); + last = now; + next = timespec_add(now, ns_to_timespec(NSEC_PER_SEC / 2)); + return 0; } +static struct notifier_block xen_pvclock_gtod_notifier = { + .notifier_call = xen_pvclock_gtod_notify, +}; + static struct clocksource xen_clocksource __read_mostly = { .name = "xen", .rating = 400, @@ -482,6 +515,9 @@ static void __init xen_time_init(void) xen_setup_runstate_info(cpu); xen_setup_timer(cpu); xen_setup_cpu_clockevents(); + + if (xen_initial_domain()) + pvclock_gtod_register_notifier(&xen_pvclock_gtod_notifier); } void __init xen_init_time_ops(void) -- 1.7.2.5 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] x86/xen: sync the wallclock when the system time changes 2013-05-28 18:22 ` [PATCH 2/2] x86/xen: sync the wallclock when the system time changes David Vrabel @ 2013-05-28 18:53 ` John Stultz 2013-05-29 7:42 ` [Xen-devel] " Jan Beulich 2013-05-29 9:42 ` David Vrabel 2013-05-29 7:39 ` [Xen-devel] " Jan Beulich 2013-05-29 7:47 ` Jan Beulich 2 siblings, 2 replies; 14+ messages in thread From: John Stultz @ 2013-05-28 18:53 UTC (permalink / raw) To: David Vrabel; +Cc: xen-devel, Konrad Rzeszutek Wilk, linux-kernel On 05/28/2013 11:22 AM, David Vrabel wrote: > From: David Vrabel <david.vrabel@citrix.com> > > Currently the Xen wallclock is only updated every 11 minutes if NTP is > synchronized to its clock source. If a guest is started before NTP is > synchronized it may see an incorrect wallclock time. > > Use the pvclock_gtod notifier chain to receive a notification when the > system time has changed and update the wallclock to match. > > This chain is called on every timer tick and we want to avoid an extra > (expensive) hypercall on every tick. Because dom0 has historically > never provided a very accurate wallclock and guests do not expect one, > we can do this simply. The wallclock is only updated if the > difference between now and the last update is more than 0.5 s. > > Signed-off-by: David Vrabel <david.vrabel@citrix.com> > --- > arch/x86/xen/time.c | 54 ++++++++++++++++++++++++++++++++++++++++++-------- > 1 files changed, 45 insertions(+), 9 deletions(-) > > diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c > index 4656165..81027b5 100644 > --- a/arch/x86/xen/time.c > +++ b/arch/x86/xen/time.c > @@ -15,6 +15,8 @@ > #include <linux/math64.h> > #include <linux/gfp.h> > #include <linux/mc146818rtc.h> > +#include <linux/timekeeper_internal.h> Nope. You shouldn't be including this. > +#include <linux/pvclock_gtod.h> > > #include <asm/pvclock.h> > #include <asm/xen/hypervisor.h> > @@ -199,28 +201,59 @@ static void xen_get_wallclock(struct timespec *now) > > static int xen_set_wallclock(const struct timespec *now) > { > - struct xen_platform_op op; > - int ret; > - > /* do nothing for domU */ > if (!xen_initial_domain()) > return -1; > > - /* Set the Xen wallclock. */ > + /* Set the hardware RTC. */ > + return mach_set_rtc_mmss(now); > + > +} > + > +static int xen_pvclock_gtod_notify(struct notifier_block *nb, unsigned long unused, > + void *priv) > +{ > + static struct timespec last, next; > + struct timespec now; > + struct timekeeper *tk = priv; Noooo.. don't export the timekeeper like that. > + struct xen_platform_op op; > + int ret; > + > + /* > + * Set the Xen wallclock from Linux system time. > + * > + * dom0 hasn't historically maintained a very accurate > + * wallclock so guests don't expect it. We can therefore > + * reduce the number of expensive hypercalls by only updating > + * the wallclock every 0.5 s. > + */ > + > + now.tv_sec = tk->xtime_sec; > + now.tv_nsec = tk->xtime_nsec >> tk->shift; You probably want current_kernel_time() here. > + > + if (timespec_compare(&now, &last) > 0 > + && timespec_compare(&now, &next) < 0) > + return 0; > + > op.cmd = XENPF_settime; > - op.u.settime.secs = now->tv_sec; > - op.u.settime.nsecs = now->tv_nsec; > + op.u.settime.secs = now.tv_sec; > + op.u.settime.nsecs = now.tv_nsec; > op.u.settime.system_time = xen_clocksource_read(); > > ret = HYPERVISOR_dom0_op(&op); > if (ret) > - return ret; > + return 0; > > - /* Set the hardware RTC. */ > - return mach_set_rtc_mmss(now); > + last = now; > + next = timespec_add(now, ns_to_timespec(NSEC_PER_SEC / 2)); > Am I missing the xen_set_wallclock hook here? Your previous patch wanted to call the dom0 op and then set the hardware RTC. And this notifier get called every timer tick? This seems out there... thanks -john ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Xen-devel] [PATCH 2/2] x86/xen: sync the wallclock when the system time changes 2013-05-28 18:53 ` John Stultz @ 2013-05-29 7:42 ` Jan Beulich 2013-05-29 9:42 ` David Vrabel 1 sibling, 0 replies; 14+ messages in thread From: Jan Beulich @ 2013-05-29 7:42 UTC (permalink / raw) To: David Vrabel, John Stultz; +Cc: xen-devel, Konrad Rzeszutek Wilk, linux-kernel >>> On 28.05.13 at 20:53, John Stultz <john.stultz@linaro.org> wrote: > On 05/28/2013 11:22 AM, David Vrabel wrote: >> op.cmd = XENPF_settime; >> - op.u.settime.secs = now->tv_sec; >> - op.u.settime.nsecs = now->tv_nsec; >> + op.u.settime.secs = now.tv_sec; >> + op.u.settime.nsecs = now.tv_nsec; >> op.u.settime.system_time = xen_clocksource_read(); >> >> ret = HYPERVISOR_dom0_op(&op); >> if (ret) >> - return ret; >> + return 0; >> >> - /* Set the hardware RTC. */ >> - return mach_set_rtc_mmss(now); >> + last = now; >> + next = timespec_add(now, ns_to_timespec(NSEC_PER_SEC / 2)); >> > > Am I missing the xen_set_wallclock hook here? Your previous patch wanted > to call the dom0 op and then set the hardware RTC. That ought to be intentional: We should update the hypervisor's software wall clock here, but limit updating of the RTC to whenever a native kernel would do this (i.e. among other things subject to CONFIG_RTC_SYSTOHC). Jan ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] x86/xen: sync the wallclock when the system time changes 2013-05-28 18:53 ` John Stultz 2013-05-29 7:42 ` [Xen-devel] " Jan Beulich @ 2013-05-29 9:42 ` David Vrabel 2013-06-04 1:22 ` Marcelo Tosatti 1 sibling, 1 reply; 14+ messages in thread From: David Vrabel @ 2013-05-29 9:42 UTC (permalink / raw) To: John Stultz Cc: xen-devel, Konrad Rzeszutek Wilk, linux-kernel, Marcelo Tosatti On 28/05/13 19:53, John Stultz wrote: > On 05/28/2013 11:22 AM, David Vrabel wrote: >> From: David Vrabel <david.vrabel@citrix.com> >> >> Currently the Xen wallclock is only updated every 11 minutes if NTP is >> synchronized to its clock source. If a guest is started before NTP is >> synchronized it may see an incorrect wallclock time. >> >> Use the pvclock_gtod notifier chain to receive a notification when the >> system time has changed and update the wallclock to match. >> >> This chain is called on every timer tick and we want to avoid an extra >> (expensive) hypercall on every tick. Because dom0 has historically >> never provided a very accurate wallclock and guests do not expect one, >> we can do this simply. The wallclock is only updated if the >> difference between now and the last update is more than 0.5 s. [...] >> index 4656165..81027b5 100644 >> --- a/arch/x86/xen/time.c >> +++ b/arch/x86/xen/time.c [...] >> + struct xen_platform_op op; >> + int ret; >> + >> + /* >> + * Set the Xen wallclock from Linux system time. >> + * >> + * dom0 hasn't historically maintained a very accurate >> + * wallclock so guests don't expect it. We can therefore >> + * reduce the number of expensive hypercalls by only updating >> + * the wallclock every 0.5 s. >> + */ >> + >> + now.tv_sec = tk->xtime_sec; >> + now.tv_nsec = tk->xtime_nsec >> tk->shift; > > You probably want current_kernel_time() here. Ah. I was looking for something like this but since the notifier chain is called with various locks held stuff kept deadlocking. It looks like I can use __current_kernel_time() though. >> + >> + if (timespec_compare(&now, &last) > 0 >> + && timespec_compare(&now, &next) < 0) >> + return 0; >> + >> op.cmd = XENPF_settime; >> - op.u.settime.secs = now->tv_sec; >> - op.u.settime.nsecs = now->tv_nsec; >> + op.u.settime.secs = now.tv_sec; >> + op.u.settime.nsecs = now.tv_nsec; >> op.u.settime.system_time = xen_clocksource_read(); >> ret = HYPERVISOR_dom0_op(&op); >> if (ret) >> - return ret; >> + return 0; >> - /* Set the hardware RTC. */ >> - return mach_set_rtc_mmss(now); >> + last = now; >> + next = timespec_add(now, ns_to_timespec(NSEC_PER_SEC / 2)); >> > > Am I missing the xen_set_wallclock hook here? Your previous patch wanted > to call the dom0 op and then set the hardware RTC. As Jan says, this is deliberate. We now update the hardware CMOS RTC in the same way as bare metal and then use this notifier to only maintain the Xen wallclock for guests. > And this notifier get called every timer tick? This seems out there... This notifier was added to support similar functionality for KVM and I'm just reusing what's there. See e0b306fef (time: export time information for KVM pvclock) [1] and 16e8d74d2 (KVM: x86: notifier for clocksource changes) [2]. Perhaps Marcelo can comment on why it was necessary for this to be called on every timer tick. David [1] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e0b306fef90556233797d2e1747bd6a3ae35ea93 [2] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=16e8d74d2da9920f874b10a3d979fb25c01f518f ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] x86/xen: sync the wallclock when the system time changes 2013-05-29 9:42 ` David Vrabel @ 2013-06-04 1:22 ` Marcelo Tosatti 0 siblings, 0 replies; 14+ messages in thread From: Marcelo Tosatti @ 2013-06-04 1:22 UTC (permalink / raw) To: David Vrabel; +Cc: John Stultz, xen-devel, Konrad Rzeszutek Wilk, linux-kernel On Wed, May 29, 2013 at 10:42:04AM +0100, David Vrabel wrote: > On 28/05/13 19:53, John Stultz wrote: > > On 05/28/2013 11:22 AM, David Vrabel wrote: > >> From: David Vrabel <david.vrabel@citrix.com> > >> > >> Currently the Xen wallclock is only updated every 11 minutes if NTP is > >> synchronized to its clock source. If a guest is started before NTP is > >> synchronized it may see an incorrect wallclock time. > >> > >> Use the pvclock_gtod notifier chain to receive a notification when the > >> system time has changed and update the wallclock to match. > >> > >> This chain is called on every timer tick and we want to avoid an extra > >> (expensive) hypercall on every tick. Because dom0 has historically > >> never provided a very accurate wallclock and guests do not expect one, > >> we can do this simply. The wallclock is only updated if the > >> difference between now and the last update is more than 0.5 s. > [...] > >> index 4656165..81027b5 100644 > >> --- a/arch/x86/xen/time.c > >> +++ b/arch/x86/xen/time.c > [...] > >> + struct xen_platform_op op; > >> + int ret; > >> + > >> + /* > >> + * Set the Xen wallclock from Linux system time. > >> + * > >> + * dom0 hasn't historically maintained a very accurate > >> + * wallclock so guests don't expect it. We can therefore > >> + * reduce the number of expensive hypercalls by only updating > >> + * the wallclock every 0.5 s. > >> + */ > >> + > >> + now.tv_sec = tk->xtime_sec; > >> + now.tv_nsec = tk->xtime_nsec >> tk->shift; > > > > You probably want current_kernel_time() here. > > Ah. I was looking for something like this but since the notifier chain > is called with various locks held stuff kept deadlocking. It looks like > I can use __current_kernel_time() though. > > >> + > >> + if (timespec_compare(&now, &last) > 0 > >> + && timespec_compare(&now, &next) < 0) > >> + return 0; > >> + > >> op.cmd = XENPF_settime; > >> - op.u.settime.secs = now->tv_sec; > >> - op.u.settime.nsecs = now->tv_nsec; > >> + op.u.settime.secs = now.tv_sec; > >> + op.u.settime.nsecs = now.tv_nsec; > >> op.u.settime.system_time = xen_clocksource_read(); > >> ret = HYPERVISOR_dom0_op(&op); > >> if (ret) > >> - return ret; > >> + return 0; > >> - /* Set the hardware RTC. */ > >> - return mach_set_rtc_mmss(now); > >> + last = now; > >> + next = timespec_add(now, ns_to_timespec(NSEC_PER_SEC / 2)); > >> > > > > Am I missing the xen_set_wallclock hook here? Your previous patch wanted > > to call the dom0 op and then set the hardware RTC. > > As Jan says, this is deliberate. We now update the hardware CMOS RTC in > the same way as bare metal and then use this notifier to only maintain > the Xen wallclock for guests. > > > And this notifier get called every timer tick? This seems out there... > > This notifier was added to support similar functionality for KVM and I'm > just reusing what's there. > > See e0b306fef (time: export time information for KVM pvclock) [1] and > 16e8d74d2 (KVM: x86: notifier for clocksource changes) [2]. > > Perhaps Marcelo can comment on why it was necessary for this to be > called on every timer tick. Just so to maintain similarity with the vsyscall notifier (as in updates all fields the vsyscall notifier uses). KVM only actually makes use of the clocksource change case. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Xen-devel] [PATCH 2/2] x86/xen: sync the wallclock when the system time changes 2013-05-28 18:22 ` [PATCH 2/2] x86/xen: sync the wallclock when the system time changes David Vrabel 2013-05-28 18:53 ` John Stultz @ 2013-05-29 7:39 ` Jan Beulich 2013-05-29 9:48 ` David Vrabel 2013-05-29 7:47 ` Jan Beulich 2 siblings, 1 reply; 14+ messages in thread From: Jan Beulich @ 2013-05-29 7:39 UTC (permalink / raw) To: David Vrabel; +Cc: John Stultz, xen-devel, Konrad Rzeszutek Wilk, linux-kernel >>> On 28.05.13 at 20:22, David Vrabel <david.vrabel@citrix.com> wrote: > +static int xen_pvclock_gtod_notify(struct notifier_block *nb, unsigned long unused, > + void *priv) > +{ > + static struct timespec last, next; > + struct timespec now; > + struct timekeeper *tk = priv; > + struct xen_platform_op op; > + int ret; > + > + /* > + * Set the Xen wallclock from Linux system time. > + * > + * dom0 hasn't historically maintained a very accurate > + * wallclock so guests don't expect it. We can therefore > + * reduce the number of expensive hypercalls by only updating > + * the wallclock every 0.5 s. > + */ > + > + now.tv_sec = tk->xtime_sec; > + now.tv_nsec = tk->xtime_nsec >> tk->shift; > + > + if (timespec_compare(&now, &last) > 0 > + && timespec_compare(&now, &next) < 0) Is this really working the first time through (when both last and next are still all zeros)? Jan > + return 0; > + > op.cmd = XENPF_settime; > - op.u.settime.secs = now->tv_sec; > - op.u.settime.nsecs = now->tv_nsec; > + op.u.settime.secs = now.tv_sec; > + op.u.settime.nsecs = now.tv_nsec; > op.u.settime.system_time = xen_clocksource_read(); > > ret = HYPERVISOR_dom0_op(&op); > if (ret) > - return ret; > + return 0; > > - /* Set the hardware RTC. */ > - return mach_set_rtc_mmss(now); > + last = now; > + next = timespec_add(now, ns_to_timespec(NSEC_PER_SEC / 2)); > > + return 0; > } ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Xen-devel] [PATCH 2/2] x86/xen: sync the wallclock when the system time changes 2013-05-29 7:39 ` [Xen-devel] " Jan Beulich @ 2013-05-29 9:48 ` David Vrabel 0 siblings, 0 replies; 14+ messages in thread From: David Vrabel @ 2013-05-29 9:48 UTC (permalink / raw) To: Jan Beulich; +Cc: John Stultz, xen-devel, Konrad Rzeszutek Wilk, linux-kernel On 29/05/13 08:39, Jan Beulich wrote: >>>> On 28.05.13 at 20:22, David Vrabel <david.vrabel@citrix.com> wrote: >> +static int xen_pvclock_gtod_notify(struct notifier_block *nb, unsigned long unused, >> + void *priv) >> +{ >> + static struct timespec last, next; >> + struct timespec now; >> + struct timekeeper *tk = priv; >> + struct xen_platform_op op; >> + int ret; >> + >> + /* >> + * Set the Xen wallclock from Linux system time. >> + * >> + * dom0 hasn't historically maintained a very accurate >> + * wallclock so guests don't expect it. We can therefore >> + * reduce the number of expensive hypercalls by only updating >> + * the wallclock every 0.5 s. >> + */ >> + >> + now.tv_sec = tk->xtime_sec; >> + now.tv_nsec = tk->xtime_nsec >> tk->shift; >> + >> + if (timespec_compare(&now, &last) > 0 >> + && timespec_compare(&now, &next) < 0) > > Is this really working the first time through (when both last and > next are still all zeros)? Yes. The first time through we want to set the wallclock and this test is always false when last == next. David ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Xen-devel] [PATCH 2/2] x86/xen: sync the wallclock when the system time changes 2013-05-28 18:22 ` [PATCH 2/2] x86/xen: sync the wallclock when the system time changes David Vrabel 2013-05-28 18:53 ` John Stultz 2013-05-29 7:39 ` [Xen-devel] " Jan Beulich @ 2013-05-29 7:47 ` Jan Beulich 2013-05-29 9:37 ` David Vrabel 2 siblings, 1 reply; 14+ messages in thread From: Jan Beulich @ 2013-05-29 7:47 UTC (permalink / raw) To: David Vrabel; +Cc: John Stultz, xen-devel, Konrad Rzeszutek Wilk, linux-kernel >>> On 28.05.13 at 20:22, David Vrabel <david.vrabel@citrix.com> wrote: > @@ -199,28 +201,59 @@ static void xen_get_wallclock(struct timespec *now) > > static int xen_set_wallclock(const struct timespec *now) > { > - struct xen_platform_op op; > - int ret; > - > /* do nothing for domU */ > if (!xen_initial_domain()) > return -1; > > - /* Set the Xen wallclock. */ > + /* Set the hardware RTC. */ > + return mach_set_rtc_mmss(now); > + > +} Can't you achieve the same effect in a cleaner way by overriding x86_platform.set_wallclock only in the non-init-domain case? Jan ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Xen-devel] [PATCH 2/2] x86/xen: sync the wallclock when the system time changes 2013-05-29 7:47 ` Jan Beulich @ 2013-05-29 9:37 ` David Vrabel 2013-05-29 19:58 ` John Stultz 0 siblings, 1 reply; 14+ messages in thread From: David Vrabel @ 2013-05-29 9:37 UTC (permalink / raw) To: Jan Beulich; +Cc: John Stultz, xen-devel, Konrad Rzeszutek Wilk, linux-kernel On 29/05/13 08:47, Jan Beulich wrote: >>>> On 28.05.13 at 20:22, David Vrabel <david.vrabel@citrix.com> wrote: >> @@ -199,28 +201,59 @@ static void xen_get_wallclock(struct timespec *now) >> >> static int xen_set_wallclock(const struct timespec *now) >> { >> - struct xen_platform_op op; >> - int ret; >> - >> /* do nothing for domU */ >> if (!xen_initial_domain()) >> return -1; >> >> - /* Set the Xen wallclock. */ >> + /* Set the hardware RTC. */ >> + return mach_set_rtc_mmss(now); >> + >> +} > > Can't you achieve the same effect in a cleaner way by overriding > x86_platform.set_wallclock only in the non-init-domain case? Yes, that makes sense. John, don't apply this one yet, thanks. David ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Xen-devel] [PATCH 2/2] x86/xen: sync the wallclock when the system time changes 2013-05-29 9:37 ` David Vrabel @ 2013-05-29 19:58 ` John Stultz 0 siblings, 0 replies; 14+ messages in thread From: John Stultz @ 2013-05-29 19:58 UTC (permalink / raw) To: David Vrabel; +Cc: Jan Beulich, xen-devel, Konrad Rzeszutek Wilk, linux-kernel On 05/29/2013 02:37 AM, David Vrabel wrote: > On 29/05/13 08:47, Jan Beulich wrote: >>>>> On 28.05.13 at 20:22, David Vrabel <david.vrabel@citrix.com> wrote: >>> @@ -199,28 +201,59 @@ static void xen_get_wallclock(struct timespec *now) >>> >>> static int xen_set_wallclock(const struct timespec *now) >>> { >>> - struct xen_platform_op op; >>> - int ret; >>> - >>> /* do nothing for domU */ >>> if (!xen_initial_domain()) >>> return -1; >>> >>> - /* Set the Xen wallclock. */ >>> + /* Set the hardware RTC. */ >>> + return mach_set_rtc_mmss(now); >>> + >>> +} >> Can't you achieve the same effect in a cleaner way by overriding >> x86_platform.set_wallclock only in the non-init-domain case? > Yes, that makes sense. John, don't apply this one yet, thanks. Ok. Zapped from my tree. thanks -john ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2013-06-04 1:23 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-05-28 18:22 [PATCHv2 0/2] xen: maintain an accurate persistent clock in more cases David Vrabel 2013-05-28 18:22 ` [PATCH 1/2] x86/xen: sync the CMOS RTC as well as the Xen wallclock David Vrabel 2013-05-28 19:01 ` John Stultz 2013-05-28 19:05 ` Konrad Rzeszutek Wilk 2013-05-28 18:22 ` [PATCH 2/2] x86/xen: sync the wallclock when the system time changes David Vrabel 2013-05-28 18:53 ` John Stultz 2013-05-29 7:42 ` [Xen-devel] " Jan Beulich 2013-05-29 9:42 ` David Vrabel 2013-06-04 1:22 ` Marcelo Tosatti 2013-05-29 7:39 ` [Xen-devel] " Jan Beulich 2013-05-29 9:48 ` David Vrabel 2013-05-29 7:47 ` Jan Beulich 2013-05-29 9:37 ` David Vrabel 2013-05-29 19:58 ` John Stultz
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox