From cf896571679a69ca8d6f88cb57558de00c9a148e Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 12 Oct 2007 23:04:06 +0200 Subject: [PATCH] --- yaml --- r: 67742 b: refs/heads/master c: 3c9aea47425885ec8b1f7b0df88c2ebc6f747c9d h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/x86/kernel/nmi_32.c | 3 ++- trunk/arch/x86/kernel/time_32.c | 3 +++ trunk/include/asm-x86/hardirq_32.h | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 3f7270c330c7..c89ecd2eb3d3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c8a1d398de70a7774359b4720c392891cdd485f9 +refs/heads/master: 3c9aea47425885ec8b1f7b0df88c2ebc6f747c9d diff --git a/trunk/arch/x86/kernel/nmi_32.c b/trunk/arch/x86/kernel/nmi_32.c index c7227e2180f8..95d3fc203cf7 100644 --- a/trunk/arch/x86/kernel/nmi_32.c +++ b/trunk/arch/x86/kernel/nmi_32.c @@ -353,7 +353,8 @@ __kprobes int nmi_watchdog_tick(struct pt_regs * regs, unsigned reason) * 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_cpu(cpu).irqs[0]; + sum = per_cpu(irq_stat, cpu).apic_timer_irqs + + per_cpu(irq_stat, cpu).irq0_irqs; /* if the none of the timers isn't firing, this cpu isn't doing much */ if (!touched && last_irq_sums[cpu] == sum) { diff --git a/trunk/arch/x86/kernel/time_32.c b/trunk/arch/x86/kernel/time_32.c index 19a6c678d02e..56dadfc2f41c 100644 --- a/trunk/arch/x86/kernel/time_32.c +++ b/trunk/arch/x86/kernel/time_32.c @@ -157,6 +157,9 @@ EXPORT_SYMBOL(profile_pc); */ irqreturn_t timer_interrupt(int irq, void *dev_id) { + /* Keep nmi watchdog up to date */ + per_cpu(irq_stat, smp_processor_id()).irq0_irqs++; + #ifdef CONFIG_X86_IO_APIC if (timer_ack) { /* diff --git a/trunk/include/asm-x86/hardirq_32.h b/trunk/include/asm-x86/hardirq_32.h index 0e358dc405f8..34649585bb59 100644 --- a/trunk/include/asm-x86/hardirq_32.h +++ b/trunk/include/asm-x86/hardirq_32.h @@ -9,6 +9,7 @@ typedef struct { unsigned long idle_timestamp; unsigned int __nmi_count; /* arch dependent */ unsigned int apic_timer_irqs; /* arch dependent */ + unsigned int irq0_irqs; } ____cacheline_aligned irq_cpustat_t; DECLARE_PER_CPU(irq_cpustat_t, irq_stat);