aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2006-06-29 05:24:58 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-29 13:26:25 -0400
commit43f7775944e40221827e4b3aec43824aa4c4e4a9 (patch)
tree842490e2fe78b8676741d1b012a4256c2224685c
parentf1c2662cbc6a0a9772655649bdf579803d33470b (diff)
[PATCH] genirq: more verbose debugging on unexpected IRQ vectors
One frequent sign of IRQ handling bugs is the appearance of unexpected vectors. Print out all the IRQ state in that case. We dont want this patch upstream, but it is useful during initial testing. Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--kernel/irq/handle.c2
-rw-r--r--kernel/irq/internals.h40
2 files changed, 42 insertions, 0 deletions
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
index 01fc7f79d74a..5a360dd4331b 100644
--- a/kernel/irq/handle.c
+++ b/kernel/irq/handle.c
@@ -24,6 +24,7 @@
24void fastcall 24void fastcall
25handle_bad_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs) 25handle_bad_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs)
26{ 26{
27 print_irq_desc(irq, desc);
27 kstat_this_cpu.irqs[irq]++; 28 kstat_this_cpu.irqs[irq]++;
28 ack_bad_irq(irq); 29 ack_bad_irq(irq);
29} 30}
@@ -61,6 +62,7 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned = {
61 */ 62 */
62static void ack_bad(unsigned int irq) 63static void ack_bad(unsigned int irq)
63{ 64{
65 print_irq_desc(irq, irq_desc + irq);
64 ack_bad_irq(irq); 66 ack_bad_irq(irq);
65} 67}
66 68
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h
index 2ba8ae3c8e96..08a849a22447 100644
--- a/kernel/irq/internals.h
+++ b/kernel/irq/internals.h
@@ -22,3 +22,43 @@ static inline void unregister_handler_proc(unsigned int irq,
22 struct irqaction *action) { } 22 struct irqaction *action) { }
23#endif 23#endif
24 24
25/*
26 * Debugging printout:
27 */
28
29#include <linux/kallsyms.h>
30
31#define P(f) if (desc->status & f) printk("%14s set\n", #f)
32
33static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc)
34{
35 printk("irq %d, desc: %p, depth: %d, count: %d, unhandled: %d\n",
36 irq, desc, desc->depth, desc->irq_count, desc->irqs_unhandled);
37 printk("->handle_irq(): %p, ", desc->handle_irq);
38 print_symbol("%s\n", (unsigned long)desc->handle_irq);
39 printk("->chip(): %p, ", desc->chip);
40 print_symbol("%s\n", (unsigned long)desc->chip);
41 printk("->action(): %p\n", desc->action);
42 if (desc->action) {
43 printk("->action->handler(): %p, ", desc->action->handler);
44 print_symbol("%s\n", (unsigned long)desc->action->handler);
45 }
46
47 P(IRQ_INPROGRESS);
48 P(IRQ_DISABLED);
49 P(IRQ_PENDING);
50 P(IRQ_REPLAY);
51 P(IRQ_AUTODETECT);
52 P(IRQ_WAITING);
53 P(IRQ_LEVEL);
54 P(IRQ_MASKED);
55#ifdef CONFIG_IRQ_PER_CPU
56 P(IRQ_PER_CPU);
57#endif
58 P(IRQ_NOPROBE);
59 P(IRQ_NOREQUEST);
60 P(IRQ_NOAUTOEN);
61}
62
63#undef P
64