diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2007-02-13 07:26:25 -0500 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2007-02-13 07:26:25 -0500 |
commit | 2fb12a9bca5ad9aa6dcd2c639b4a7656a8843ef8 (patch) | |
tree | cf83dc4fba430aa8ecd542ef86b29a68d938ba83 /arch/x86_64/kernel/irq.c | |
parent | bcde1ebb81c51ebdfa02887703e4d21c1bbc2431 (diff) |
[PATCH] x86-64: survive having no irq mapping for a vector
Occasionally the kernel has bugs that result in no irq being found for a
given cpu vector. If we acknowledge the irq the system has a good chance
of continuing even though we dropped an irq message. If we continue to
simply print a message and not acknowledge the irq the system is likely to
become non-responsive shortly there after.
AK: Fixed compilation for UP kernels
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Cc: "Luigi Genoni" <luigi.genoni@pirelli.com>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'arch/x86_64/kernel/irq.c')
-rw-r--r-- | arch/x86_64/kernel/irq.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/x86_64/kernel/irq.c b/arch/x86_64/kernel/irq.c index 0c06af6c13bc..3bc30d2c13d3 100644 --- a/arch/x86_64/kernel/irq.c +++ b/arch/x86_64/kernel/irq.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <asm/uaccess.h> | 18 | #include <asm/uaccess.h> |
19 | #include <asm/io_apic.h> | 19 | #include <asm/io_apic.h> |
20 | #include <asm/idle.h> | 20 | #include <asm/idle.h> |
21 | #include <asm/smp.h> | ||
21 | 22 | ||
22 | atomic_t irq_err_count; | 23 | atomic_t irq_err_count; |
23 | 24 | ||
@@ -120,9 +121,14 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs) | |||
120 | 121 | ||
121 | if (likely(irq < NR_IRQS)) | 122 | if (likely(irq < NR_IRQS)) |
122 | generic_handle_irq(irq); | 123 | generic_handle_irq(irq); |
123 | else if (printk_ratelimit()) | 124 | else { |
124 | printk(KERN_EMERG "%s: %d.%d No irq handler for vector\n", | 125 | if (!disable_apic) |
125 | __func__, smp_processor_id(), vector); | 126 | ack_APIC_irq(); |
127 | |||
128 | if (printk_ratelimit()) | ||
129 | printk(KERN_EMERG "%s: %d.%d No irq handler for vector\n", | ||
130 | __func__, smp_processor_id(), vector); | ||
131 | } | ||
126 | 132 | ||
127 | irq_exit(); | 133 | irq_exit(); |
128 | 134 | ||