x86: hpet: Fix HPET timer + NMI watchdog panic
PATCH 1/1 x86: hpet: Fix HPET timer + NMI watchdog panic
HPET doesn't use timer_interrupt() as interrupt handler now. So count of HPET interrupt isn't recorded in per_cpu(irq_stat, cpu).irq0_irqs. This confuses NMI watchdog when using HPET as tick device.
---
arch/x86/include/asm/hardirq.h +3 -0
@@ -12,6 +12,9 @@ typedef struct {unsigned int apic_timer_irqs;/* arch dependent */ unsigned int irq_spurious_count;#endif +#ifdef CONFIG_HPET_TIMER +unsigned int hpet_timer_irqs; +#endif unsigned int x86_platform_ipis;/* arch dependent */ unsigned int apic_perf_irqs;unsigned int apic_irq_work_irqs;
arch/x86/kernel/apic/nmi.c +8 -1
@@ -80,8 +80,15 @@ static inline int mce_in_progress(void)*/ static inline unsigned int get_timer_irqs (int cpu) { -return per_cpu (irq_stat, cpu).apic_timer_irqs + +unsigned int irqs; +#ifdef CONFIG_HPET_TIMER + irqs =per_cpu (irq_stat, cpu).hpet_timer_irqs; +#else + irqs =0 ; +#endif + irqs +=per_cpu (irq_stat, cpu).apic_timer_irqs +per_cpu (irq_stat, cpu).irq0_irqs; +return irqs; }#ifdef CONFIG_SMP
arch/x86/kernel/hpet.c +1 -0
@@ -517,6 +517,7 @@ static irqreturn_t hpet_interrupt_handler(int irq, void *data)struct hpet_dev *dev = (struct hpet_dev *)data;struct clock_event_device *hevt = &dev->evt; +inc_irq_stat (hpet_timer_irqs);if (!hevt->event_handler) {printk (KERN_INFO "Spurious HPET timer interrupt on HPET timer %d\n" , dev->num);
arch/x86/kernel/time.c +1 -1
@@ -56,7 +56,7 @@ unsigned long profile_pc(struct pt_regs *regs)EXPORT_SYMBOL (profile_pc);/* -* Default timer interrupt handler for PIT/HPET +* Default timer interrupt handler for PIT */ static irqreturn_t timer_interrupt (int irq,void *dev_id) {
Quoted 5 lines · Zheng
HPET doesn't use
timer_interrupt()as interrupt handler now. So count of HPET interrupt isn't recorded inper_cpu(irq_stat, cpu).irq0_irqs. This confuses NMI watchdog when using HPET as tick device.Signed-off-by Yan, Zheng <[email protected]>
Not sure if this patch is needed because x86/kerne/apic/nmi.c will most likely disappear in 2.6.38 (it is already in gone in linux-next). The new nmi watchdog doesn't rely on HPET stats but instead uses a more generic approach of a HRES timer.
Cheers,
Don
Quoted 68 lines
---
arch/x86/include/asm/hardirq.h +3
-0@@ -12,6 +12,9 @@ typedef struct {unsigned int apic_timer_irqs;/* arch dependent */ unsigned int irq_spurious_count;#endif +#ifdef CONFIG_HPET_TIMER +unsigned int hpet_timer_irqs; +#endif unsigned int x86_platform_ipis;/* arch dependent */ unsigned int apic_perf_irqs;unsigned int apic_irq_work_irqs;arch/x86/kernel/apic/nmi.c +8
-1@@ -80,8 +80,15 @@ static inline int mce_in_progress(void)*/ static inline unsigned int get_timer_irqs (int cpu) { -return per_cpu (irq_stat, cpu).apic_timer_irqs + +unsigned int irqs; +#ifdef CONFIG_HPET_TIMER + irqs =per_cpu (irq_stat, cpu).hpet_timer_irqs; +#else + irqs =0 ; +#endif + irqs +=per_cpu (irq_stat, cpu).apic_timer_irqs +per_cpu (irq_stat, cpu).irq0_irqs; +return irqs; }#ifdef CONFIG_SMP arch/x86/kernel/hpet.c +1
-0@@ -517,6 +517,7 @@ static irqreturn_t hpet_interrupt_handler(int irq, void *data)struct hpet_dev *dev = (struct hpet_dev *)data;struct clock_event_device *hevt = &dev->evt; +inc_irq_stat (hpet_timer_irqs);if (!hevt->event_handler) {printk (KERN_INFO "Spurious HPET timer interrupt on HPET timer %d\n" , dev->num);arch/x86/kernel/time.c +1
-2@@ -56,7 +56,7 @@ unsigned long profile_pc(struct pt_regs *regs)EXPORT_SYMBOL (profile_pc);/* -* Default timer interrupt handler for PIT/HPET +* Default timer interrupt handler for PIT */ static irqreturn_t timer_interrupt (int irq,void *dev_id) { --To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/