|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86/watchdog: Use real timestamps for watchdog timeout
Do not assume that we will only receive interrupts at a rate of nmi_hz. On a
test system being debugged, I observed a PCI SERR being continuously asserted
without the SERR bit being set. The result was Xen "exceeding" a 300 second
timeout within 1 second.
Change the nmi_watchdog_tick() timecounting to use timestamps rather than a
rate calculated from nmi_hz (which itself has been seen to deviate on some
systems due to Turbo/Pstates).
Also, move the comment to a more appropriate place (as we would expect to
enter the old if() block once a second anyway), and fix up two trailing
whitespace issues.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
diff -r c6fb586f83a0 -r ebb0070be9fd xen/arch/x86/nmi.c
--- a/xen/arch/x86/nmi.c
+++ b/xen/arch/x86/nmi.c
@@ -396,7 +396,7 @@ static struct notifier_block cpu_nmi_nfb
};
static DEFINE_PER_CPU(unsigned int, last_irq_sums);
-static DEFINE_PER_CPU(unsigned int, alert_counter);
+static DEFINE_PER_CPU(s_time_t, last_irq_change);
static atomic_t watchdog_disable_count = ATOMIC_INIT(1);
@@ -432,23 +432,22 @@ void nmi_watchdog_tick(struct cpu_user_r
if ( (this_cpu(last_irq_sums) == sum) &&
!atomic_read(&watchdog_disable_count) )
{
- /*
- * Ayiee, looks like this CPU is stuck ... wait for the timeout
- * before doing the oops ...
- */
- this_cpu(alert_counter)++;
- if ( this_cpu(alert_counter) == opt_watchdog_timeout*nmi_hz )
+ s_time_t last_change = this_cpu(last_irq_change);
+
+ if ( (NOW() - last_change) > SECONDS(opt_watchdog_timeout) )
{
+ /* Ayiee, looks like this CPU is stuck. */
+
console_force_unlock();
printk("Watchdog timer detects that CPU%d is stuck!\n",
smp_processor_id());
fatal_trap(TRAP_nmi, regs);
}
- }
- else
+ }
+ else
{
this_cpu(last_irq_sums) = sum;
- this_cpu(alert_counter) = 0;
+ this_cpu(last_irq_change) = NOW();
}
if ( nmi_perfctr_msr )
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |