mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	powerpc: handle irq_enter/irq_exit in interrupt handler wrappers
Move irq_enter/irq_exit into asynchronous interrupt handler wrappers. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20210130130852.2952424-35-npiggin@gmail.com
This commit is contained in:
		
							parent
							
								
									6fdb0f410b
								
							
						
					
					
						commit
						1b1b6a6f4c
					
				
					 6 changed files with 8 additions and 18 deletions
				
			
		| 
						 | 
				
			
			@ -43,10 +43,12 @@ static inline void interrupt_exit_prepare(struct pt_regs *regs, struct interrupt
 | 
			
		|||
static inline void interrupt_async_enter_prepare(struct pt_regs *regs, struct interrupt_state *state)
 | 
			
		||||
{
 | 
			
		||||
	interrupt_enter_prepare(regs, state);
 | 
			
		||||
	irq_enter();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void interrupt_async_exit_prepare(struct pt_regs *regs, struct interrupt_state *state)
 | 
			
		||||
{
 | 
			
		||||
	irq_exit();
 | 
			
		||||
	interrupt_exit_prepare(regs, state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,6 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(doorbell_exception)
 | 
			
		|||
{
 | 
			
		||||
	struct pt_regs *old_regs = set_irq_regs(regs);
 | 
			
		||||
 | 
			
		||||
	irq_enter();
 | 
			
		||||
	trace_doorbell_entry(regs);
 | 
			
		||||
 | 
			
		||||
	ppc_msgsync();
 | 
			
		||||
| 
						 | 
				
			
			@ -36,7 +35,7 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(doorbell_exception)
 | 
			
		|||
	smp_ipi_demux_relaxed(); /* already performed the barrier */
 | 
			
		||||
 | 
			
		||||
	trace_doorbell_exit(regs);
 | 
			
		||||
	irq_exit();
 | 
			
		||||
 | 
			
		||||
	set_irq_regs(old_regs);
 | 
			
		||||
}
 | 
			
		||||
#else /* CONFIG_SMP */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -641,8 +641,6 @@ void __do_irq(struct pt_regs *regs)
 | 
			
		|||
{
 | 
			
		||||
	unsigned int irq;
 | 
			
		||||
 | 
			
		||||
	irq_enter();
 | 
			
		||||
 | 
			
		||||
	trace_irq_entry(regs);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
| 
						 | 
				
			
			@ -662,8 +660,6 @@ void __do_irq(struct pt_regs *regs)
 | 
			
		|||
		generic_handle_irq(irq);
 | 
			
		||||
 | 
			
		||||
	trace_irq_exit(regs);
 | 
			
		||||
 | 
			
		||||
	irq_exit();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_INTERRUPT_HANDLER_ASYNC(do_IRQ)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -105,12 +105,9 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(TAUException)
 | 
			
		|||
{
 | 
			
		||||
	int cpu = smp_processor_id();
 | 
			
		||||
 | 
			
		||||
	irq_enter();
 | 
			
		||||
	tau[cpu].interrupts++;
 | 
			
		||||
 | 
			
		||||
	TAUupdate(cpu);
 | 
			
		||||
 | 
			
		||||
	irq_exit();
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_TAU_INT */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -611,7 +611,7 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt)
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
	old_regs = set_irq_regs(regs);
 | 
			
		||||
	irq_enter();
 | 
			
		||||
 | 
			
		||||
	trace_timer_interrupt_entry(regs);
 | 
			
		||||
 | 
			
		||||
	if (test_irq_work_pending()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -636,7 +636,7 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt)
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	trace_timer_interrupt_exit(regs);
 | 
			
		||||
	irq_exit();
 | 
			
		||||
 | 
			
		||||
	set_irq_regs(old_regs);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(timer_interrupt);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -801,7 +801,9 @@ void die_mce(const char *str, struct pt_regs *regs, long err)
 | 
			
		|||
	 * do_exit() checks for in_interrupt() and panics in that case, so
 | 
			
		||||
	 * exit the irq/nmi before calling die.
 | 
			
		||||
	 */
 | 
			
		||||
	if (!IS_ENABLED(CONFIG_PPC_BOOK3S_64))
 | 
			
		||||
	if (IS_ENABLED(CONFIG_PPC_BOOK3S_64))
 | 
			
		||||
		irq_exit();
 | 
			
		||||
	else
 | 
			
		||||
		nmi_exit();
 | 
			
		||||
	die(str, regs, err);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1061,7 +1063,6 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(handle_hmi_exception)
 | 
			
		|||
	struct pt_regs *old_regs;
 | 
			
		||||
 | 
			
		||||
	old_regs = set_irq_regs(regs);
 | 
			
		||||
	irq_enter();
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_VSX
 | 
			
		||||
	/* Real mode flagged P9 special emu is needed */
 | 
			
		||||
| 
						 | 
				
			
			@ -1081,7 +1082,6 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(handle_hmi_exception)
 | 
			
		|||
	if (ppc_md.handle_hmi_exception)
 | 
			
		||||
		ppc_md.handle_hmi_exception(regs);
 | 
			
		||||
 | 
			
		||||
	irq_exit();
 | 
			
		||||
	set_irq_regs(old_regs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1907,13 +1907,9 @@ DEFINE_INTERRUPT_HANDLER_NMI(performance_monitor_exception_nmi)
 | 
			
		|||
DECLARE_INTERRUPT_HANDLER_ASYNC(performance_monitor_exception_async);
 | 
			
		||||
DEFINE_INTERRUPT_HANDLER_ASYNC(performance_monitor_exception_async)
 | 
			
		||||
{
 | 
			
		||||
	irq_enter();
 | 
			
		||||
 | 
			
		||||
	__this_cpu_inc(irq_stat.pmu_irqs);
 | 
			
		||||
 | 
			
		||||
	perf_irq(regs);
 | 
			
		||||
 | 
			
		||||
	irq_exit();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_INTERRUPT_HANDLER_RAW(performance_monitor_exception)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue