Commit 43f77759 authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds

[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: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent f1c2662c
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
void fastcall void fastcall
handle_bad_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs) handle_bad_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs)
{ {
print_irq_desc(irq, desc);
kstat_this_cpu.irqs[irq]++; kstat_this_cpu.irqs[irq]++;
ack_bad_irq(irq); ack_bad_irq(irq);
} }
...@@ -61,6 +62,7 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned = { ...@@ -61,6 +62,7 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned = {
*/ */
static void ack_bad(unsigned int irq) static void ack_bad(unsigned int irq)
{ {
print_irq_desc(irq, irq_desc + irq);
ack_bad_irq(irq); ack_bad_irq(irq);
} }
......
...@@ -22,3 +22,43 @@ static inline void unregister_handler_proc(unsigned int irq, ...@@ -22,3 +22,43 @@ static inline void unregister_handler_proc(unsigned int irq,
struct irqaction *action) { } struct irqaction *action) { }
#endif #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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment