52 lines
1.7 KiB
Diff
52 lines
1.7 KiB
Diff
|
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
|
||
|
|
||
|
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>
|
||
|
|
||
|
diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h
|
||
|
index cd02f32..6226870 100644
|
||
|
--- a/arch/x86/include/asm/pvclock.h
|
||
|
+++ b/arch/x86/include/asm/pvclock.h
|
||
|
@@ -11,5 +11,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 239427c..a4f07c1 100644
|
||
|
--- a/arch/x86/kernel/pvclock.c
|
||
|
+++ b/arch/x86/kernel/pvclock.c
|
||
|
@@ -120,6 +120,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 b2bb5aa..5da5e53 100644
|
||
|
--- a/arch/x86/xen/time.c
|
||
|
+++ b/arch/x86/xen/time.c
|
||
|
@@ -426,6 +426,8 @@ void xen_timer_resume(void)
|
||
|
{
|
||
|
int cpu;
|
||
|
|
||
|
+ pvclock_resume();
|
||
|
+
|
||
|
if (xen_clockevent != &xen_vcpuop_clockevent)
|
||
|
return;
|