|
@@ -43,6 +43,13 @@ unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src)
|
|
|
return pv_tsc_khz;
|
|
|
}
|
|
|
|
|
|
+void pvclock_touch_watchdogs(void)
|
|
|
+{
|
|
|
+ touch_softlockup_watchdog_sync();
|
|
|
+ clocksource_touch_watchdog();
|
|
|
+ rcu_cpu_stall_reset();
|
|
|
+}
|
|
|
+
|
|
|
static atomic64_t last_value = ATOMIC64_INIT(0);
|
|
|
|
|
|
void pvclock_resume(void)
|
|
@@ -74,6 +81,11 @@ cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
|
|
|
version = __pvclock_read_cycles(src, &ret, &flags);
|
|
|
} while ((src->version & 1) || version != src->version);
|
|
|
|
|
|
+ if (unlikely((flags & PVCLOCK_GUEST_STOPPED) != 0)) {
|
|
|
+ src->flags &= ~PVCLOCK_GUEST_STOPPED;
|
|
|
+ pvclock_touch_watchdogs();
|
|
|
+ }
|
|
|
+
|
|
|
if ((valid_flags & PVCLOCK_TSC_STABLE_BIT) &&
|
|
|
(flags & PVCLOCK_TSC_STABLE_BIT))
|
|
|
return ret;
|