diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2008-10-16 12:18:50 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-10-16 16:53:30 +0200 |
commit | 249f6d9eab372790579ada8991bba3384c204e06 (patch) | |
tree | 4af29e889c073ec317e7674f2165e49c9adab9b1 /arch/x86/kernel/irq.c | |
parent | 6b39ba771e3c78d00e0abcebad270bd4212b28bc (diff) | |
download | op-kernel-dev-249f6d9eab372790579ada8991bba3384c204e06.zip op-kernel-dev-249f6d9eab372790579ada8991bba3384c204e06.tar.gz |
x86: move ack_bad_irq() to irq.c
Share more duplicated code.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/kernel/irq.c')
-rw-r--r-- | arch/x86/kernel/irq.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 3b91284..ccf6c50 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c @@ -12,6 +12,29 @@ atomic_t irq_err_count; +/* + * 'what should we do if we get a hw irq event on an illegal vector'. + * each architecture has to answer this themselves. + */ +void ack_bad_irq(unsigned int irq) +{ + printk(KERN_ERR "unexpected IRQ trap at vector %02x\n", irq); + +#ifdef CONFIG_X86_LOCAL_APIC + /* + * Currently unexpected vectors happen only on SMP and APIC. + * We _must_ ack these because every local APIC has only N + * irq slots per priority level, and a 'hanging, unacked' IRQ + * holds up an irq slot - in excessive cases (when multiple + * unexpected vectors occur) that might lock up the APIC + * completely. + * But only ack when the APIC is enabled -AK + */ + if (cpu_has_apic) + ack_APIC_irq(); +#endif +} + #ifdef CONFIG_X86_32 # define irq_stats(x) (&per_cpu(irq_stat,x)) #else |