irq: provide debug_poll_all_shared_irqs() method under CONFIG_DEBUG_SHIRQ
Provide a shared interrupt debug facility under CONFIG_DEBUG_SHIRQ: it uses the existing irqpoll facilities to iterate through all registered interrupt handlers and call those which can handle shared IRQ lines. This can be handy for suspend/resume debugging: if we call this function early during resume we can trigger crashes in those drivers which have incorrect assumptions about when exactly their ISRs will be called during suspend/resume. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Родитель
5a2dd72abd
Коммит
74296a8ed6
|
@ -462,6 +462,12 @@ static inline void init_irq_proc(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_GENERIC_HARDIRQS) && defined(CONFIG_DEBUG_SHIRQ)
|
||||
extern void debug_poll_all_shared_irqs(void);
|
||||
#else
|
||||
static inline void debug_poll_all_shared_irqs(void) { }
|
||||
#endif
|
||||
|
||||
int show_interrupts(struct seq_file *p, void *v);
|
||||
|
||||
struct irq_desc;
|
||||
|
|
|
@ -104,7 +104,7 @@ static int misrouted_irq(int irq)
|
|||
return ok;
|
||||
}
|
||||
|
||||
static void poll_spurious_irqs(unsigned long dummy)
|
||||
static void poll_all_shared_irqs(void)
|
||||
{
|
||||
struct irq_desc *desc;
|
||||
int i;
|
||||
|
@ -123,11 +123,23 @@ static void poll_spurious_irqs(unsigned long dummy)
|
|||
|
||||
try_one_irq(i, desc);
|
||||
}
|
||||
}
|
||||
|
||||
static void poll_spurious_irqs(unsigned long dummy)
|
||||
{
|
||||
poll_all_shared_irqs();
|
||||
|
||||
mod_timer(&poll_spurious_irq_timer,
|
||||
jiffies + POLL_SPURIOUS_IRQ_INTERVAL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_SHIRQ
|
||||
void debug_poll_all_shared_irqs(void)
|
||||
{
|
||||
poll_all_shared_irqs();
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If 99,900 of the previous 100,000 interrupts have not been handled
|
||||
* then assume that the IRQ is stuck in some manner. Drop a diagnostic
|
||||
|
|
Загрузка…
Ссылка в новой задаче