From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934857AbdHYV5w (ORCPT ); Fri, 25 Aug 2017 17:57:52 -0400 Received: from Galois.linutronix.de ([146.0.238.70]:42875 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934823AbdHYV5p (ORCPT ); Fri, 25 Aug 2017 17:57:45 -0400 Message-Id: <20170825214941.401425068@linutronix.de> User-Agent: quilt/0.63-1 Date: Fri, 25 Aug 2017 23:47:03 +0200 From: Thomas Gleixner To: LKML Cc: Ingo Molnar , Peter Anvin , Peter Zijlstra , Andy Lutomirski , Borislav Petkov , Steven Rostedt Subject: [patch V2 15/44] x86/smp: Use static key for reschedule interrupt tracing References: <20170825214648.264521964@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Disposition: inline; filename=x86-smp--Use-static-key-for-reschedule-interrupt-tracing.patch Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 Reviewed-by: Steven Rostedt (VMware) --- arch/x86/include/asm/hw_irq.h | 2 +- arch/x86/kernel/smp.c | 40 +++++++++++++++------------------------- 2 files changed, 16 insertions(+), 26 deletions(-) --- a/arch/x86/include/asm/hw_irq.h +++ b/arch/x86/include/asm/hw_irq.h @@ -48,7 +48,7 @@ extern asmlinkage void call_function_sin #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 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c @@ -254,37 +254,27 @@ static void native_stop_other_cpus(int w } /* - * 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)