mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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:
		
							parent
							
								
									5a2dd72abd
								
							
						
					
					
						commit
						74296a8ed6
					
				
					 2 changed files with 19 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue