| From 7d2a89e1fe15597e4aaa741d9bac446cc1a109fe Mon Sep 17 00:00:00 2001 |
| From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> |
| Date: Mon, 25 Oct 2010 16:53:46 -0700 |
| Subject: [PATCH] x86/pvclock: Zero last_value on resume |
| |
| commit e7a3481c0246c8e45e79c629efd63b168e91fcda upstream. |
| |
| If the guest domain has been suspend/resumed or migrated, then the |
| system clock backing the pvclock clocksource may revert to a smaller |
| value (ie, can be non-monotonic across the migration/save-restore). |
| |
| Make sure we zero last_value in that case so that the domain |
| continues to see clock updates. |
| |
| Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> |
| Signed-off-by: Ingo Molnar <mingo@elte.hu> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h |
| index 53235fd..daaacab 100644 |
| --- a/arch/x86/include/asm/pvclock.h |
| +++ b/arch/x86/include/asm/pvclock.h |
| @@ -10,5 +10,6 @@ unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src); |
| void pvclock_read_wallclock(struct pvclock_wall_clock *wall, |
| struct pvclock_vcpu_time_info *vcpu, |
| struct timespec *ts); |
| +void pvclock_resume(void); |
| |
| #endif /* _ASM_X86_PVCLOCK_H */ |
| diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c |
| index dfdfe46..b12fe8d 100644 |
| --- a/arch/x86/kernel/pvclock.c |
| +++ b/arch/x86/kernel/pvclock.c |
| @@ -111,6 +111,11 @@ unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src) |
| |
| static atomic64_t last_value = ATOMIC64_INIT(0); |
| |
| +void pvclock_resume(void) |
| +{ |
| + atomic64_set(&last_value, 0); |
| +} |
| + |
| cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src) |
| { |
| struct pvclock_shadow_time shadow; |
| diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c |
| index e90360f..a05bda6 100644 |
| --- a/arch/x86/xen/time.c |
| +++ b/arch/x86/xen/time.c |
| @@ -425,6 +425,8 @@ void xen_timer_resume(void) |
| { |
| int cpu; |
| |
| + pvclock_resume(); |
| + |
| if (xen_clockevent != &xen_vcpuop_clockevent) |
| return; |
| |
| -- |
| 1.7.4.4 |
| |