arch/x86/kernel/smp.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index be8e1bde07aa..ed43259111d8 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c @@ -265,12 +265,23 @@ __visible void smp_reschedule_interrupt(struct pt_regs *regs) */ } -static inline void smp_entering_irq(void) +/* + * This is the same as "entering_irq()", except it doesn't + * do the 'exit_idle()'. + * + * It pairs with smp_irq_exit(). + */ +static inline void smp_irq_enter(void) { - ack_APIC_irq(); irq_enter(); } +static inline void smp_irq_exit(void) +{ + irq_exit(); + ack_APIC_irq(); +} + __visible void smp_trace_reschedule_interrupt(struct pt_regs *regs) { /* @@ -279,11 +290,11 @@ __visible void smp_trace_reschedule_interrupt(struct pt_regs *regs) * scheduler_ipi(). This is OK, since those functions are allowed * to nest. */ - smp_entering_irq(); + smp_irq_enter(); trace_reschedule_entry(RESCHEDULE_VECTOR); __smp_reschedule_interrupt(); trace_reschedule_exit(RESCHEDULE_VECTOR); - exiting_irq(); + smp_irq_exit(); /* * KVM uses this interrupt to force a cpu out of guest mode */ @@ -297,18 +308,18 @@ static inline void __smp_call_function_interrupt(void) __visible void smp_call_function_interrupt(struct pt_regs *regs) { - smp_entering_irq(); + smp_irq_enter(); __smp_call_function_interrupt(); - exiting_irq(); + smp_irq_exit(); } __visible void smp_trace_call_function_interrupt(struct pt_regs *regs) { - smp_entering_irq(); + smp_irq_enter(); trace_call_function_entry(CALL_FUNCTION_VECTOR); __smp_call_function_interrupt(); trace_call_function_exit(CALL_FUNCTION_VECTOR); - exiting_irq(); + smp_irq_exit(); } static inline void __smp_call_function_single_interrupt(void) @@ -319,18 +330,18 @@ static inline void __smp_call_function_single_interrupt(void) __visible void smp_call_function_single_interrupt(struct pt_regs *regs) { - smp_entering_irq(); + smp_irq_enter(); __smp_call_function_single_interrupt(); - exiting_irq(); + smp_irq_exit(); } __visible void smp_trace_call_function_single_interrupt(struct pt_regs *regs) { - smp_entering_irq(); + smp_irq_enter(); trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR); __smp_call_function_single_interrupt(); trace_call_function_single_exit(CALL_FUNCTION_SINGLE_VECTOR); - exiting_irq(); + smp_irq_exit(); } static int __init nonmi_ipi_setup(char *str)