diff options
-rw-r--r-- | arch/x86/include/asm/pvclock.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/kvmclock.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/pvclock.c | 12 |
3 files changed, 15 insertions, 0 deletions
diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h index be8269b00e2a..d6b078e9fa28 100644 --- a/arch/x86/include/asm/pvclock.h +++ b/arch/x86/include/asm/pvclock.h | |||
@@ -14,6 +14,8 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *wall, | |||
14 | struct timespec *ts); | 14 | struct timespec *ts); |
15 | void pvclock_resume(void); | 15 | void pvclock_resume(void); |
16 | 16 | ||
17 | void pvclock_touch_watchdogs(void); | ||
18 | |||
17 | /* | 19 | /* |
18 | * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction, | 20 | * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction, |
19 | * yielding a 64-bit result. | 21 | * yielding a 64-bit result. |
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 1570e0741344..e6041094ff26 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c | |||
@@ -139,6 +139,7 @@ bool kvm_check_and_clear_guest_paused(void) | |||
139 | src = &hv_clock[cpu].pvti; | 139 | src = &hv_clock[cpu].pvti; |
140 | if ((src->flags & PVCLOCK_GUEST_STOPPED) != 0) { | 140 | if ((src->flags & PVCLOCK_GUEST_STOPPED) != 0) { |
141 | src->flags &= ~PVCLOCK_GUEST_STOPPED; | 141 | src->flags &= ~PVCLOCK_GUEST_STOPPED; |
142 | pvclock_touch_watchdogs(); | ||
142 | ret = true; | 143 | ret = true; |
143 | } | 144 | } |
144 | 145 | ||
diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c index a16bae3f83b3..6279928c0a71 100644 --- a/arch/x86/kernel/pvclock.c +++ b/arch/x86/kernel/pvclock.c | |||
@@ -43,6 +43,13 @@ unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src) | |||
43 | return pv_tsc_khz; | 43 | return pv_tsc_khz; |
44 | } | 44 | } |
45 | 45 | ||
46 | void pvclock_touch_watchdogs(void) | ||
47 | { | ||
48 | touch_softlockup_watchdog_sync(); | ||
49 | clocksource_touch_watchdog(); | ||
50 | rcu_cpu_stall_reset(); | ||
51 | } | ||
52 | |||
46 | static atomic64_t last_value = ATOMIC64_INIT(0); | 53 | static atomic64_t last_value = ATOMIC64_INIT(0); |
47 | 54 | ||
48 | void pvclock_resume(void) | 55 | void pvclock_resume(void) |
@@ -74,6 +81,11 @@ cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src) | |||
74 | version = __pvclock_read_cycles(src, &ret, &flags); | 81 | version = __pvclock_read_cycles(src, &ret, &flags); |
75 | } while ((src->version & 1) || version != src->version); | 82 | } while ((src->version & 1) || version != src->version); |
76 | 83 | ||
84 | if (unlikely((flags & PVCLOCK_GUEST_STOPPED) != 0)) { | ||
85 | src->flags &= ~PVCLOCK_GUEST_STOPPED; | ||
86 | pvclock_touch_watchdogs(); | ||
87 | } | ||
88 | |||
77 | if ((valid_flags & PVCLOCK_TSC_STABLE_BIT) && | 89 | if ((valid_flags & PVCLOCK_TSC_STABLE_BIT) && |
78 | (flags & PVCLOCK_TSC_STABLE_BIT)) | 90 | (flags & PVCLOCK_TSC_STABLE_BIT)) |
79 | return ret; | 91 | return ret; |