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
@ -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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
#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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user