[PATCH] genirq: more verbose debugging on unexpected IRQ vectors
authorIngo Molnar <mingo@elte.hu>
Thu, 29 Jun 2006 09:24:58 +0000 (02:24 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Thu, 29 Jun 2006 17:26:25 +0000 (10:26 -0700)
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>
kernel/irq/handle.c
kernel/irq/internals.h

index 01fc7f79d74a4508ec9cc35dc8d05a29f40524dc..5a360dd4331b0505a6f4e54c0c26317f23d3c189 100644 (file)
@@ -24,6 +24,7 @@
 void fastcall
 handle_bad_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs)
 {
+       print_irq_desc(irq, desc);
        kstat_this_cpu.irqs[irq]++;
        ack_bad_irq(irq);
 }
@@ -61,6 +62,7 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned = {
  */
 static void ack_bad(unsigned int irq)
 {
+       print_irq_desc(irq, irq_desc + irq);
        ack_bad_irq(irq);
 }
 
index 2ba8ae3c8e963d51a88e8c9652fb777bd9cfabea..08a849a224475102084ca807de6861b6ab7286b5 100644 (file)
@@ -22,3 +22,43 @@ static inline void unregister_handler_proc(unsigned int irq,
                                           struct irqaction *action) { }
 #endif
 
+/*
+ * Debugging printout:
+ */
+
+#include <linux/kallsyms.h>
+
+#define P(f) if (desc->status & f) printk("%14s set\n", #f)
+
+static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc)
+{
+       printk("irq %d, desc: %p, depth: %d, count: %d, unhandled: %d\n",
+               irq, desc, desc->depth, desc->irq_count, desc->irqs_unhandled);
+       printk("->handle_irq():  %p, ", desc->handle_irq);
+       print_symbol("%s\n", (unsigned long)desc->handle_irq);
+       printk("->chip(): %p, ", desc->chip);
+       print_symbol("%s\n", (unsigned long)desc->chip);
+       printk("->action(): %p\n", desc->action);
+       if (desc->action) {
+               printk("->action->handler(): %p, ", desc->action->handler);
+               print_symbol("%s\n", (unsigned long)desc->action->handler);
+       }
+
+       P(IRQ_INPROGRESS);
+       P(IRQ_DISABLED);
+       P(IRQ_PENDING);
+       P(IRQ_REPLAY);
+       P(IRQ_AUTODETECT);
+       P(IRQ_WAITING);
+       P(IRQ_LEVEL);
+       P(IRQ_MASKED);
+#ifdef CONFIG_IRQ_PER_CPU
+       P(IRQ_PER_CPU);
+#endif
+       P(IRQ_NOPROBE);
+       P(IRQ_NOREQUEST);
+       P(IRQ_NOAUTOEN);
+}
+
+#undef P
+