Commit 96d97cf0 authored by Andi Kleen's avatar Andi Kleen Committed by Ingo Molnar

x86: add /proc/irq/*/spurious to dump the spurious irq debugging state

This is useful to debug problems with interrupt handlers that return
sometimes IRQ_NONE.
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 9e094c17
...@@ -75,6 +75,18 @@ static int irq_affinity_write_proc(struct file *file, const char __user *buffer, ...@@ -75,6 +75,18 @@ static int irq_affinity_write_proc(struct file *file, const char __user *buffer,
#endif #endif
static int irq_spurious_read(char *page, char **start, off_t off,
int count, int *eof, void *data)
{
struct irq_desc *d = &irq_desc[(long) data];
return sprintf(page, "count %u\n"
"unhandled %u\n"
"last_unhandled %u ms\n",
d->irq_count,
d->irqs_unhandled,
jiffies_to_msecs(d->last_unhandled));
}
#define MAX_NAMELEN 128 #define MAX_NAMELEN 128
static int name_unique(unsigned int irq, struct irqaction *new_action) static int name_unique(unsigned int irq, struct irqaction *new_action)
...@@ -118,6 +130,7 @@ void register_handler_proc(unsigned int irq, struct irqaction *action) ...@@ -118,6 +130,7 @@ void register_handler_proc(unsigned int irq, struct irqaction *action)
void register_irq_proc(unsigned int irq) void register_irq_proc(unsigned int irq)
{ {
char name [MAX_NAMELEN]; char name [MAX_NAMELEN];
struct proc_dir_entry *entry;
if (!root_irq_dir || if (!root_irq_dir ||
(irq_desc[irq].chip == &no_irq_chip) || (irq_desc[irq].chip == &no_irq_chip) ||
...@@ -132,8 +145,6 @@ void register_irq_proc(unsigned int irq) ...@@ -132,8 +145,6 @@ void register_irq_proc(unsigned int irq)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
{ {
struct proc_dir_entry *entry;
/* create /proc/irq/<irq>/smp_affinity */ /* create /proc/irq/<irq>/smp_affinity */
entry = create_proc_entry("smp_affinity", 0600, irq_desc[irq].dir); entry = create_proc_entry("smp_affinity", 0600, irq_desc[irq].dir);
...@@ -144,6 +155,12 @@ void register_irq_proc(unsigned int irq) ...@@ -144,6 +155,12 @@ void register_irq_proc(unsigned int irq)
} }
} }
#endif #endif
entry = create_proc_entry("spurious", 0444, irq_desc[irq].dir);
if (entry) {
entry->data = (void *)(long)irq;
entry->read_proc = irq_spurious_read;
}
} }
#undef MAX_NAMELEN #undef MAX_NAMELEN
......
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