Commit 1b1b6a6f authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman

powerpc: handle irq_enter/irq_exit in interrupt handler wrappers

Move irq_enter/irq_exit into asynchronous interrupt handler wrappers.
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210130130852.2952424-35-npiggin@gmail.com
parent 6fdb0f41
...@@ -43,10 +43,12 @@ static inline void interrupt_exit_prepare(struct pt_regs *regs, struct interrupt ...@@ -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) static inline void interrupt_async_enter_prepare(struct pt_regs *regs, struct interrupt_state *state)
{ {
interrupt_enter_prepare(regs, state); interrupt_enter_prepare(regs, state);
irq_enter();
} }
static inline void interrupt_async_exit_prepare(struct pt_regs *regs, struct interrupt_state *state) static inline void interrupt_async_exit_prepare(struct pt_regs *regs, struct interrupt_state *state)
{ {
irq_exit();
interrupt_exit_prepare(regs, state); interrupt_exit_prepare(regs, state);
} }
......
...@@ -23,7 +23,6 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(doorbell_exception) ...@@ -23,7 +23,6 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(doorbell_exception)
{ {
struct pt_regs *old_regs = set_irq_regs(regs); struct pt_regs *old_regs = set_irq_regs(regs);
irq_enter();
trace_doorbell_entry(regs); trace_doorbell_entry(regs);
ppc_msgsync(); ppc_msgsync();
...@@ -36,7 +35,7 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(doorbell_exception) ...@@ -36,7 +35,7 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(doorbell_exception)
smp_ipi_demux_relaxed(); /* already performed the barrier */ smp_ipi_demux_relaxed(); /* already performed the barrier */
trace_doorbell_exit(regs); trace_doorbell_exit(regs);
irq_exit();
set_irq_regs(old_regs); set_irq_regs(old_regs);
} }
#else /* CONFIG_SMP */ #else /* CONFIG_SMP */
......
...@@ -641,8 +641,6 @@ void __do_irq(struct pt_regs *regs) ...@@ -641,8 +641,6 @@ void __do_irq(struct pt_regs *regs)
{ {
unsigned int irq; unsigned int irq;
irq_enter();
trace_irq_entry(regs); trace_irq_entry(regs);
/* /*
...@@ -662,8 +660,6 @@ void __do_irq(struct pt_regs *regs) ...@@ -662,8 +660,6 @@ void __do_irq(struct pt_regs *regs)
generic_handle_irq(irq); generic_handle_irq(irq);
trace_irq_exit(regs); trace_irq_exit(regs);
irq_exit();
} }
DEFINE_INTERRUPT_HANDLER_ASYNC(do_IRQ) DEFINE_INTERRUPT_HANDLER_ASYNC(do_IRQ)
......
...@@ -105,12 +105,9 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(TAUException) ...@@ -105,12 +105,9 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(TAUException)
{ {
int cpu = smp_processor_id(); int cpu = smp_processor_id();
irq_enter();
tau[cpu].interrupts++; tau[cpu].interrupts++;
TAUupdate(cpu); TAUupdate(cpu);
irq_exit();
} }
#endif /* CONFIG_TAU_INT */ #endif /* CONFIG_TAU_INT */
......
...@@ -611,7 +611,7 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt) ...@@ -611,7 +611,7 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt)
#endif #endif
old_regs = set_irq_regs(regs); old_regs = set_irq_regs(regs);
irq_enter();
trace_timer_interrupt_entry(regs); trace_timer_interrupt_entry(regs);
if (test_irq_work_pending()) { if (test_irq_work_pending()) {
...@@ -636,7 +636,7 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt) ...@@ -636,7 +636,7 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt)
} }
trace_timer_interrupt_exit(regs); trace_timer_interrupt_exit(regs);
irq_exit();
set_irq_regs(old_regs); set_irq_regs(old_regs);
} }
EXPORT_SYMBOL(timer_interrupt); EXPORT_SYMBOL(timer_interrupt);
......
...@@ -801,7 +801,9 @@ void die_mce(const char *str, struct pt_regs *regs, long err) ...@@ -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 * do_exit() checks for in_interrupt() and panics in that case, so
* exit the irq/nmi before calling die. * 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(); nmi_exit();
die(str, regs, err); die(str, regs, err);
} }
...@@ -1061,7 +1063,6 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(handle_hmi_exception) ...@@ -1061,7 +1063,6 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(handle_hmi_exception)
struct pt_regs *old_regs; struct pt_regs *old_regs;
old_regs = set_irq_regs(regs); old_regs = set_irq_regs(regs);
irq_enter();
#ifdef CONFIG_VSX #ifdef CONFIG_VSX
/* Real mode flagged P9 special emu is needed */ /* Real mode flagged P9 special emu is needed */
...@@ -1081,7 +1082,6 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(handle_hmi_exception) ...@@ -1081,7 +1082,6 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(handle_hmi_exception)
if (ppc_md.handle_hmi_exception) if (ppc_md.handle_hmi_exception)
ppc_md.handle_hmi_exception(regs); ppc_md.handle_hmi_exception(regs);
irq_exit();
set_irq_regs(old_regs); set_irq_regs(old_regs);
} }
...@@ -1907,13 +1907,9 @@ DEFINE_INTERRUPT_HANDLER_NMI(performance_monitor_exception_nmi) ...@@ -1907,13 +1907,9 @@ DEFINE_INTERRUPT_HANDLER_NMI(performance_monitor_exception_nmi)
DECLARE_INTERRUPT_HANDLER_ASYNC(performance_monitor_exception_async); DECLARE_INTERRUPT_HANDLER_ASYNC(performance_monitor_exception_async);
DEFINE_INTERRUPT_HANDLER_ASYNC(performance_monitor_exception_async) DEFINE_INTERRUPT_HANDLER_ASYNC(performance_monitor_exception_async)
{ {
irq_enter();
__this_cpu_inc(irq_stat.pmu_irqs); __this_cpu_inc(irq_stat.pmu_irqs);
perf_irq(regs); perf_irq(regs);
irq_exit();
} }
DEFINE_INTERRUPT_HANDLER_RAW(performance_monitor_exception) DEFINE_INTERRUPT_HANDLER_RAW(performance_monitor_exception)
......
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