|
@@ -23,6 +23,7 @@
|
|
#include <linux/dmi.h>
|
|
#include <linux/dmi.h>
|
|
#include <linux/kprobes.h>
|
|
#include <linux/kprobes.h>
|
|
#include <linux/cpumask.h>
|
|
#include <linux/cpumask.h>
|
|
|
|
+#include <linux/kernel_stat.h>
|
|
|
|
|
|
#include <asm/smp.h>
|
|
#include <asm/smp.h>
|
|
#include <asm/nmi.h>
|
|
#include <asm/nmi.h>
|
|
@@ -973,9 +974,13 @@ __kprobes int nmi_watchdog_tick(struct pt_regs * regs, unsigned reason)
|
|
cpu_clear(cpu, backtrace_mask);
|
|
cpu_clear(cpu, backtrace_mask);
|
|
}
|
|
}
|
|
|
|
|
|
- sum = per_cpu(irq_stat, cpu).apic_timer_irqs;
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Take the local apic timer and PIT/HPET into account. We don't
|
|
|
|
+ * know which one is active, when we have highres/dyntick on
|
|
|
|
+ */
|
|
|
|
+ sum = per_cpu(irq_stat, cpu).apic_timer_irqs + kstat_irqs(0);
|
|
|
|
|
|
- /* if the apic timer isn't firing, this cpu isn't doing much */
|
|
|
|
|
|
+ /* if the none of the timers isn't firing, this cpu isn't doing much */
|
|
if (!touched && last_irq_sums[cpu] == sum) {
|
|
if (!touched && last_irq_sums[cpu] == sum) {
|
|
/*
|
|
/*
|
|
* Ayiee, looks like this CPU is stuck ...
|
|
* Ayiee, looks like this CPU is stuck ...
|