]> Pileus Git - ~andy/linux/blobdiff - arch/x86/kernel/pvclock.c
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[~andy/linux] / arch / x86 / kernel / pvclock.c
index a16bae3f83b37ab189dbe2a443f1461a075a6ae7..2f355d229a587771680b28080d92fd06f345d7e7 100644 (file)
@@ -43,6 +43,14 @@ 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();
+       reset_hung_task_detector();
+}
+
 static atomic64_t last_value = ATOMIC64_INIT(0);
 
 void pvclock_resume(void)
@@ -74,6 +82,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;