diff options
Diffstat (limited to 'arch/x86/kernel/smp.c')
| -rw-r--r-- | arch/x86/kernel/smp.c | 29 | 
1 files changed, 18 insertions, 11 deletions
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index f4fe0b8879e0..cdaa347dfcad 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c @@ -265,23 +265,30 @@ void smp_reschedule_interrupt(struct pt_regs *regs)  	 */  } -void smp_trace_reschedule_interrupt(struct pt_regs *regs) +static inline void smp_entering_irq(void)  {  	ack_APIC_irq(); +	irq_enter(); +} + +void smp_trace_reschedule_interrupt(struct pt_regs *regs) +{ +	/* +	 * Need to call irq_enter() before calling the trace point. +	 * __smp_reschedule_interrupt() calls irq_enter/exit() too (in +	 * scheduler_ipi(). This is OK, since those functions are allowed +	 * to nest. +	 */ +	smp_entering_irq();  	trace_reschedule_entry(RESCHEDULE_VECTOR);  	__smp_reschedule_interrupt();  	trace_reschedule_exit(RESCHEDULE_VECTOR); +	exiting_irq();  	/*  	 * KVM uses this interrupt to force a cpu out of guest mode  	 */  } -static inline void call_function_entering_irq(void) -{ -	ack_APIC_irq(); -	irq_enter(); -} -  static inline void __smp_call_function_interrupt(void)  {  	generic_smp_call_function_interrupt(); @@ -290,14 +297,14 @@ static inline void __smp_call_function_interrupt(void)  void smp_call_function_interrupt(struct pt_regs *regs)  { -	call_function_entering_irq(); +	smp_entering_irq();  	__smp_call_function_interrupt();  	exiting_irq();  }  void smp_trace_call_function_interrupt(struct pt_regs *regs)  { -	call_function_entering_irq(); +	smp_entering_irq();  	trace_call_function_entry(CALL_FUNCTION_VECTOR);  	__smp_call_function_interrupt();  	trace_call_function_exit(CALL_FUNCTION_VECTOR); @@ -312,14 +319,14 @@ static inline void __smp_call_function_single_interrupt(void)  void smp_call_function_single_interrupt(struct pt_regs *regs)  { -	call_function_entering_irq(); +	smp_entering_irq();  	__smp_call_function_single_interrupt();  	exiting_irq();  }  void smp_trace_call_function_single_interrupt(struct pt_regs *regs)  { -	call_function_entering_irq(); +	smp_entering_irq();  	trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR);  	__smp_call_function_single_interrupt();  	trace_call_function_single_exit(CALL_FUNCTION_SINGLE_VECTOR);  | 
