]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
x86/smp: Use static key for reschedule interrupt tracing
authorThomas Gleixner <tglx@linutronix.de>
Mon, 28 Aug 2017 06:47:30 +0000 (08:47 +0200)
committerIngo Molnar <mingo@kernel.org>
Tue, 29 Aug 2017 09:42:27 +0000 (11:42 +0200)
It's worth to avoid the extra irq_enter()/irq_exit() pair in the case that
the reschedule interrupt tracepoints are disabled.

Use the static key which indicates that exception tracing is enabled. For
now this key is global. It will be optimized in a later step.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20170828064957.299808677@linutronix.de
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/include/asm/hw_irq.h
arch/x86/kernel/smp.c

index 8fb6c228438f3eb6e25d0f9ab79b070039a68826..4626f8790ce78db61e52ce34e2f3651701959d39 100644 (file)
@@ -48,7 +48,7 @@ extern asmlinkage void call_function_single_interrupt(void);
 
 #ifdef CONFIG_TRACING
 /* Interrupt handlers registered during init_IRQ */
-extern void trace_reschedule_interrupt(void);
+#define trace_reschedule_interrupt     reschedule_interrupt
 #define trace_call_function_interrupt  call_function_interrupt
 #define trace_call_function_single_interrupt   call_function_single_interrupt
 #define trace_thermal_interrupt        thermal_interrupt
index fb49e10cc30a4c4a265f1a7de5427e8dad38b699..cfe865b85bc5368ee5b2499adf3c7a5bf4b65283 100644 (file)
@@ -254,37 +254,27 @@ static void native_stop_other_cpus(int wait)
 }
 
 /*
- * Reschedule call back.
+ * Reschedule call back. KVM uses this interrupt to force a cpu out of
+ * guest mode
  */
-static inline void __smp_reschedule_interrupt(void)
-{
-       inc_irq_stat(irq_resched_count);
-       scheduler_ipi();
-}
-
 __visible void __irq_entry smp_reschedule_interrupt(struct pt_regs *regs)
 {
        ack_APIC_irq();
-       __smp_reschedule_interrupt();
-       /*
-        * KVM uses this interrupt to force a cpu out of guest mode
-        */
-}
-
-__visible void __irq_entry 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.
-        */
-       ipi_entering_ack_irq();
-       trace_reschedule_entry(RESCHEDULE_VECTOR);
        inc_irq_stat(irq_resched_count);
+
+       if (trace_irqvectors_enabled()) {
+               /*
+                * scheduler_ipi() might call irq_enter() as well, but
+                * nested calls are fine.
+                */
+               irq_enter();
+               trace_reschedule_entry(RESCHEDULE_VECTOR);
+               scheduler_ipi();
+               trace_reschedule_exit(RESCHEDULE_VECTOR);
+               irq_exit();
+               return;
+       }
        scheduler_ipi();
-       trace_reschedule_exit(RESCHEDULE_VECTOR);
-       exiting_irq();
 }
 
 __visible void __irq_entry smp_call_function_interrupt(struct pt_regs *regs)