On Mon, Oct 07, 2013 at 10:05:17PM -0300, Marcelo Tosatti wrote: > Implement reset of kernel watchdogs at pvclock read time. This avoids > adding special code to every watchdog. > > This is possible for watchdogs which measure time based on sched_clock() or > ktime_get() variants. > > Suggested by Don Zickus. > > Signed-off-by: Marcelo Tosatti <mtosatti@xxxxxxxxxx> Awesome. Thanks for figuring this out Marcelo. Does that mean we can revert commit 5d1c0f4a now? :-) This meets my expectations. I'll leave it to the virt folks to figure out if this covers all the corner cases or not. Cheers, Don > > Index: kvm/arch/x86/kernel/kvmclock.c > =================================================================== > --- kvm.orig/arch/x86/kernel/kvmclock.c > +++ kvm/arch/x86/kernel/kvmclock.c > @@ -139,6 +139,7 @@ bool kvm_check_and_clear_guest_paused(vo > src = &hv_clock[cpu].pvti; > if ((src->flags & PVCLOCK_GUEST_STOPPED) != 0) { > src->flags &= ~PVCLOCK_GUEST_STOPPED; > + pvclock_touch_watchdogs(); > ret = true; > } > > Index: kvm/arch/x86/kernel/pvclock.c > =================================================================== > --- kvm.orig/arch/x86/kernel/pvclock.c > +++ kvm/arch/x86/kernel/pvclock.c > @@ -21,6 +21,7 @@ > #include <linux/sched.h> > #include <linux/gfp.h> > #include <linux/bootmem.h> > +#include <linux/hung_task.h> > #include <asm/fixmap.h> > #include <asm/pvclock.h> > > @@ -43,6 +44,14 @@ unsigned long pvclock_tsc_khz(struct pvc > 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 +83,11 @@ cycle_t pvclock_clocksource_read(struct > 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; > Index: kvm/arch/x86/include/asm/pvclock.h > =================================================================== > --- kvm.orig/arch/x86/include/asm/pvclock.h > +++ kvm/arch/x86/include/asm/pvclock.h > @@ -14,6 +14,8 @@ void pvclock_read_wallclock(struct pvclo > struct timespec *ts); > void pvclock_resume(void); > > +void pvclock_touch_watchdogs(void); > + > /* > * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction, > * yielding a 64-bit result. > > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html