From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752675AbdH2LPd (ORCPT ); Tue, 29 Aug 2017 07:15:33 -0400 Received: from terminus.zytor.com ([65.50.211.136]:42577 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751609AbdH2LPb (ORCPT ); Tue, 29 Aug 2017 07:15:31 -0400 Date: Tue, 29 Aug 2017 04:10:50 -0700 From: tip-bot for Thomas Gleixner Message-ID: Cc: bp@alien8.de, torvalds@linux-foundation.org, linux-kernel@vger.kernel.org, tglx@linutronix.de, peterz@infradead.org, rostedt@goodmis.org, luto@kernel.org, mingo@kernel.org, hpa@zytor.com Reply-To: bp@alien8.de, torvalds@linux-foundation.org, linux-kernel@vger.kernel.org, peterz@infradead.org, tglx@linutronix.de, rostedt@goodmis.org, luto@kernel.org, mingo@kernel.org, hpa@zytor.com In-Reply-To: <20170828064957.536699116@linutronix.de> References: <20170828064957.536699116@linutronix.de> To: linux-tip-commits@vger.kernel.org Subject: [tip:x86/apic] x86/tracing: Disentangle pagefault and resched IPI tracing key Git-Commit-ID: 809547472edae0bc68f2b5abc37b92c8a988bc8a X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 809547472edae0bc68f2b5abc37b92c8a988bc8a Gitweb: http://git.kernel.org/tip/809547472edae0bc68f2b5abc37b92c8a988bc8a Author: Thomas Gleixner AuthorDate: Mon, 28 Aug 2017 08:47:33 +0200 Committer: Ingo Molnar CommitDate: Tue, 29 Aug 2017 11:42:29 +0200 x86/tracing: Disentangle pagefault and resched IPI tracing key The pagefault and the resched IPI handler are the only ones where it is worth to optimize the code further in case tracepoints are disabled. But it makes no sense to have a single static key for both. Seperate the static keys so the facilities are handled seperately. Signed-off-by: Thomas Gleixner Cc: Andy Lutomirski Cc: Borislav Petkov Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Steven Rostedt Link: http://lkml.kernel.org/r/20170828064957.536699116@linutronix.de Signed-off-by: Ingo Molnar --- arch/x86/include/asm/trace/common.h | 15 ++++++++------- arch/x86/include/asm/trace/exceptions.h | 6 ++++-- arch/x86/include/asm/trace/irq_vectors.h | 29 +++++++++++++++++++++++------ arch/x86/kernel/smp.c | 2 +- arch/x86/kernel/tracepoint.c | 27 ++++++++++++++++++++++----- arch/x86/mm/fault.c | 2 +- 6 files changed, 59 insertions(+), 22 deletions(-) diff --git a/arch/x86/include/asm/trace/common.h b/arch/x86/include/asm/trace/common.h index b1eb7b1..57c8da02 100644 --- a/arch/x86/include/asm/trace/common.h +++ b/arch/x86/include/asm/trace/common.h @@ -1,15 +1,16 @@ #ifndef _ASM_TRACE_COMMON_H #define _ASM_TRACE_COMMON_H -extern int trace_irq_vector_regfunc(void); -extern void trace_irq_vector_unregfunc(void); - #ifdef CONFIG_TRACING -DECLARE_STATIC_KEY_FALSE(trace_irqvectors_key); -#define trace_irqvectors_enabled() \ - static_branch_unlikely(&trace_irqvectors_key) +DECLARE_STATIC_KEY_FALSE(trace_pagefault_key); +#define trace_pagefault_enabled() \ + static_branch_unlikely(&trace_pagefault_key) +DECLARE_STATIC_KEY_FALSE(trace_resched_ipi_key); +#define trace_resched_ipi_enabled() \ + static_branch_unlikely(&trace_resched_ipi_key) #else -static inline bool trace_irqvectors_enabled(void) { return false; } +static inline bool trace_pagefault_enabled(void) { return false; } +static inline bool trace_resched_ipi_enabled(void) { return false; } #endif #endif diff --git a/arch/x86/include/asm/trace/exceptions.h b/arch/x86/include/asm/trace/exceptions.h index 960a5b5..5665bf2 100644 --- a/arch/x86/include/asm/trace/exceptions.h +++ b/arch/x86/include/asm/trace/exceptions.h @@ -7,6 +7,9 @@ #include #include +extern int trace_pagefault_reg(void); +extern void trace_pagefault_unreg(void); + DECLARE_EVENT_CLASS(x86_exceptions, TP_PROTO(unsigned long address, struct pt_regs *regs, @@ -35,8 +38,7 @@ DEFINE_EVENT_FN(x86_exceptions, name, \ TP_PROTO(unsigned long address, struct pt_regs *regs, \ unsigned long error_code), \ TP_ARGS(address, regs, error_code), \ - trace_irq_vector_regfunc, \ - trace_irq_vector_unregfunc); + trace_pagefault_reg, trace_pagefault_unreg); DEFINE_PAGE_FAULT_EVENT(page_fault_user); DEFINE_PAGE_FAULT_EVENT(page_fault_kernel); diff --git a/arch/x86/include/asm/trace/irq_vectors.h b/arch/x86/include/asm/trace/irq_vectors.h index 7825b44..a1bdc25 100644 --- a/arch/x86/include/asm/trace/irq_vectors.h +++ b/arch/x86/include/asm/trace/irq_vectors.h @@ -7,6 +7,9 @@ #include #include +extern int trace_resched_ipi_reg(void); +extern void trace_resched_ipi_unreg(void); + DECLARE_EVENT_CLASS(x86_irq_vector, TP_PROTO(int vector), @@ -26,15 +29,22 @@ DECLARE_EVENT_CLASS(x86_irq_vector, #define DEFINE_IRQ_VECTOR_EVENT(name) \ DEFINE_EVENT_FN(x86_irq_vector, name##_entry, \ TP_PROTO(int vector), \ + TP_ARGS(vector), NULL, NULL); \ +DEFINE_EVENT_FN(x86_irq_vector, name##_exit, \ + TP_PROTO(int vector), \ + TP_ARGS(vector), NULL, NULL); + +#define DEFINE_RESCHED_IPI_EVENT(name) \ +DEFINE_EVENT_FN(x86_irq_vector, name##_entry, \ + TP_PROTO(int vector), \ TP_ARGS(vector), \ - trace_irq_vector_regfunc, \ - trace_irq_vector_unregfunc); \ + trace_resched_ipi_reg, \ + trace_resched_ipi_unreg); \ DEFINE_EVENT_FN(x86_irq_vector, name##_exit, \ TP_PROTO(int vector), \ TP_ARGS(vector), \ - trace_irq_vector_regfunc, \ - trace_irq_vector_unregfunc); - + trace_resched_ipi_reg, \ + trace_resched_ipi_unreg); /* * local_timer - called when entering/exiting a local timer interrupt @@ -43,9 +53,16 @@ DEFINE_EVENT_FN(x86_irq_vector, name##_exit, \ DEFINE_IRQ_VECTOR_EVENT(local_timer); /* + * The ifdef is required because that tracepoint macro hell emits tracepoint + * code in files which include this header even if the tracepoint is not + * enabled. Brilliant stuff that. + */ +#ifdef CONFIG_SMP +/* * reschedule - called when entering/exiting a reschedule vector handler */ -DEFINE_IRQ_VECTOR_EVENT(reschedule); +DEFINE_RESCHED_IPI_EVENT(reschedule); +#endif /* * spurious_apic - called when entering/exiting a spurious apic vector handler diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index cfe865b..5c574df 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c @@ -262,7 +262,7 @@ __visible void __irq_entry smp_reschedule_interrupt(struct pt_regs *regs) ack_APIC_irq(); inc_irq_stat(irq_resched_count); - if (trace_irqvectors_enabled()) { + if (trace_resched_ipi_enabled()) { /* * scheduler_ipi() might call irq_enter() as well, but * nested calls are fine. diff --git a/arch/x86/kernel/tracepoint.c b/arch/x86/kernel/tracepoint.c index 4cae92f..c6636d1 100644 --- a/arch/x86/kernel/tracepoint.c +++ b/arch/x86/kernel/tracepoint.c @@ -10,15 +10,32 @@ #include #include -DEFINE_STATIC_KEY_FALSE(trace_irqvectors_key); +DEFINE_STATIC_KEY_FALSE(trace_pagefault_key); -int trace_irq_vector_regfunc(void) +int trace_pagefault_reg(void) { - static_branch_inc(&trace_irqvectors_key); + static_branch_inc(&trace_pagefault_key); return 0; } -void trace_irq_vector_unregfunc(void) +void trace_pagefault_unreg(void) { - static_branch_dec(&trace_irqvectors_key); + static_branch_dec(&trace_pagefault_key); } + +#ifdef CONFIG_SMP + +DEFINE_STATIC_KEY_FALSE(trace_resched_ipi_key); + +int trace_resched_ipi_reg(void) +{ + static_branch_inc(&trace_resched_ipi_key); + return 0; +} + +void trace_resched_ipi_unreg(void) +{ + static_branch_dec(&trace_resched_ipi_key); +} + +#endif diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 58d7b3a..f9bb660 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -1510,7 +1510,7 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code) enum ctx_state prev_state; prev_state = exception_enter(); - if (trace_irqvectors_enabled()) + if (trace_pagefault_enabled()) trace_page_fault_entries(address, regs, error_code); __do_page_fault(regs, error_code, address);