From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.linutronix.de (146.0.238.70:993) by crypto-ml.lab.linutronix.de with IMAP4-SSL for ; 24 Feb 2019 15:08:13 -0000 Received: from mga01.intel.com ([192.55.52.88]) by Galois.linutronix.de with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1gxvNp-0001Qv-KO for speck@linutronix.de; Sun, 24 Feb 2019 16:08:02 +0100 From: Andi Kleen Subject: [MODERATED] [PATCH v6 14/43] MDSv6 Date: Sun, 24 Feb 2019 07:07:20 -0800 Message-Id: <4ff65f2e0b2e00d8658d7514831ce40e1f9ddcaf.1551019522.git.ak@linux.intel.com> In-Reply-To: References: In-Reply-To: References: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit MIME-Version: 1.0 To: speck@linutronix.de Cc: Andi Kleen List-ID: Add trace points for clear_cpu and lazy_clear_cpu. This is useful for debugging and performance testing. The trace points have to be partially out of line to avoid include loops, but the fast path jump labels are inlined. The idle case cannot be traced because trace points don't like idle context. Signed-off-by: Andi Kleen --- arch/x86/include/asm/clearcpu.h | 36 +++++++++++++++++++++++++-- arch/x86/include/asm/trace/clearcpu.h | 27 ++++++++++++++++++++ arch/x86/kernel/cpu/bugs.c | 17 +++++++++++++ 3 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 arch/x86/include/asm/trace/clearcpu.h diff --git a/arch/x86/include/asm/clearcpu.h b/arch/x86/include/asm/clearcpu.h index 30e802bae2ca..b6f3a7184531 100644 --- a/arch/x86/include/asm/clearcpu.h +++ b/arch/x86/include/asm/clearcpu.h @@ -6,6 +6,29 @@ #include #include +/* + * We cannot directly include the trace point header here + * because it leads to include loops with other trace point + * files pulling this one in. Define the static + * key manually here, which handles noping the fast path, + * and the actual tracing is done out of line. + */ +#ifdef CONFIG_TRACEPOINTS +#include +#include + +extern struct tracepoint __tracepoint_clear_cpu; +extern struct tracepoint __tracepoint_lazy_clear_cpu; +#define cc_tracepoint_active(t) static_key_false(&(t).key) + +extern void do_trace_clear_cpu(void); +extern void do_trace_lazy_clear_cpu(void); +#else +#define cc_tracepoint_active(t) false +static inline void do_trace_clear_cpu(void) {} +static inline void do_trace_lazy_clear_cpu(void) {} +#endif + DECLARE_PER_CPU(bool, clear_cpu_flag); /* @@ -13,7 +36,7 @@ DECLARE_PER_CPU(bool, clear_cpu_flag); * We use microcode as a side effect of the obsolete VERW instruction */ -static inline void clear_cpu(void) +static inline void __clear_cpu(void) { unsigned kernel_ds = __KERNEL_DS; /* Has to be memory form, don't modify to use an register */ @@ -21,6 +44,13 @@ static inline void clear_cpu(void) [kernelds] "m" (kernel_ds)); } +static inline void clear_cpu(void) +{ + if (cc_tracepoint_active(__tracepoint_clear_cpu)) + do_trace_clear_cpu(); + __clear_cpu(); +} + /* * Clear CPU buffers before going idle, so that no state is leaked to SMT * siblings taking over thread resources. @@ -37,12 +67,14 @@ static inline void clear_cpu_idle(void) { if (sched_smt_active()) { __this_cpu_write(clear_cpu_flag, false); - clear_cpu(); + __clear_cpu(); } } static inline void lazy_clear_cpu(void) { + if (cc_tracepoint_active(__tracepoint_lazy_clear_cpu)) + do_trace_lazy_clear_cpu(); __this_cpu_write(clear_cpu_flag, true); } diff --git a/arch/x86/include/asm/trace/clearcpu.h b/arch/x86/include/asm/trace/clearcpu.h new file mode 100644 index 000000000000..e742b5cd8ee9 --- /dev/null +++ b/arch/x86/include/asm/trace/clearcpu.h @@ -0,0 +1,27 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM clearcpu + +#if !defined(_TRACE_CLEARCPU_H) || defined(TRACE_HEADER_MULTI_READ) + +#include + +DECLARE_EVENT_CLASS(clear_cpu, + TP_PROTO(int dummy), + TP_ARGS(dummy), + TP_STRUCT__entry(__field(int, dummy)), + TP_fast_assign(), + TP_printk("%d", __entry->dummy)); + +DEFINE_EVENT(clear_cpu, clear_cpu, TP_PROTO(int dummy), TP_ARGS(dummy)); +DEFINE_EVENT(clear_cpu, lazy_clear_cpu, TP_PROTO(int dummy), TP_ARGS(dummy)); + +#define _TRACE_CLEARCPU_H + +#undef TRACE_INCLUDE_PATH +#define TRACE_INCLUDE_PATH asm/trace/ +#undef TRACE_INCLUDE_FILE +#define TRACE_INCLUDE_FILE clearcpu +#endif /* _TRACE_CLEARCPU_H */ + +/* This part must be outside protection */ +#include diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c index a756c57979be..146f9abc1931 100644 --- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c @@ -1061,6 +1061,23 @@ early_param("l1tf", l1tf_cmdline); #undef pr_fmt +#define CREATE_TRACE_POINTS +#include + +void do_trace_clear_cpu(void) +{ + trace_clear_cpu(0); +} +EXPORT_SYMBOL(do_trace_clear_cpu); +EXPORT_TRACEPOINT_SYMBOL(clear_cpu); + +void do_trace_lazy_clear_cpu(void) +{ + trace_lazy_clear_cpu(0); +} +EXPORT_SYMBOL(do_trace_lazy_clear_cpu); +EXPORT_TRACEPOINT_SYMBOL(lazy_clear_cpu); + DEFINE_PER_CPU(bool, clear_cpu_flag); EXPORT_PER_CPU_SYMBOL(clear_cpu_flag); -- 2.17.2