Index: xenbase/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c =================================================================== --- xenbase/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c (revision 8316) +++ xenbase/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c (working copy) @@ -610,6 +610,7 @@ s64 delta, delta_cpu, stolen, blocked; u64 sched_time; int i, cpu = smp_processor_id(); + s64 adjust_watchdog; struct shadow_time_info *shadow = &per_cpu(shadow_time, cpu); struct vcpu_runstate_info *runstate = &per_cpu(runstate, cpu); @@ -655,11 +656,27 @@ per_cpu(processed_system_time, i)); } + /* Offlined for more than a few ticks? Avoid lockup warnings. */ + adjust_watchdog = stolen; + if (adjust_watchdog > NS_PER_TICK*100) { + printk("Timer ISR/%d: Stolen time > 100 jiffies (%lldns): touching watchdog\n", + cpu, adjust_watchdog); + } + /* System-wide jiffy work. */ while (delta >= NS_PER_TICK) { delta -= NS_PER_TICK; processed_system_time += NS_PER_TICK; do_timer(regs); + + if (adjust_watchdog > 0) { + /* Avoid lockup warnings - note that this + does not handle the case where the watchdog + was one jiffy away from expiring but would have + been reset - oh well! */ + touch_softlockup_watchdog(); + adjust_watchdog -= NS_PER_TICK; + } } if (shadow_tv_version != HYPERVISOR_shared_info->wc_version) {