-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
x86/fpu: Add tracepoints to dump FPU state at key points
I've been carrying this patch around for a bit and it's helped me solve at least a couple FPU-related bugs. In addition to using it for debugging, I also drug it out because using AVX (and AVX2/AVX-512) can have serious power consequences for a modern core. It's very important to be able to figure out who is using it. It's also insanely useful to go out and see who is using a given feature, like MPX or Memory Protection Keys. If you, for instance, want to find all processes using protection keys, you can do: echo 'xfeatures & 0x200' > filter Since 0x200 is the protection keys feature bit. Note that this touches the KVM code. KVM did a CREATE_TRACE_POINTS and then included a bunch of random headers. If anyone one of those included other tracepoints, it would have defined the *OTHER* tracepoints. That's bogus, so move it to the right place. Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Dave Hansen <dave@sr71.net> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Quentin Casasnovas <quentin.casasnovas@oracle.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/20160601174220.3CDFB90E@viggo.jf.intel.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
- Loading branch information
Dave Hansen
authored and
Ingo Molnar
committed
Jun 8, 2016
1 parent
c8ae067
commit d1898b7
Showing
5 changed files
with
148 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
#undef TRACE_SYSTEM | ||
#define TRACE_SYSTEM x86_fpu | ||
|
||
#if !defined(_TRACE_FPU_H) || defined(TRACE_HEADER_MULTI_READ) | ||
#define _TRACE_FPU_H | ||
|
||
#include <linux/tracepoint.h> | ||
|
||
DECLARE_EVENT_CLASS(x86_fpu, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu), | ||
|
||
TP_STRUCT__entry( | ||
__field(struct fpu *, fpu) | ||
__field(bool, fpregs_active) | ||
__field(bool, fpstate_active) | ||
__field(int, counter) | ||
__field(u64, xfeatures) | ||
__field(u64, xcomp_bv) | ||
), | ||
|
||
TP_fast_assign( | ||
__entry->fpu = fpu; | ||
__entry->fpregs_active = fpu->fpregs_active; | ||
__entry->fpstate_active = fpu->fpstate_active; | ||
__entry->counter = fpu->counter; | ||
if (boot_cpu_has(X86_FEATURE_OSXSAVE)) { | ||
__entry->xfeatures = fpu->state.xsave.header.xfeatures; | ||
__entry->xcomp_bv = fpu->state.xsave.header.xcomp_bv; | ||
} | ||
), | ||
TP_printk("x86/fpu: %p fpregs_active: %d fpstate_active: %d counter: %d xfeatures: %llx xcomp_bv: %llx", | ||
__entry->fpu, | ||
__entry->fpregs_active, | ||
__entry->fpstate_active, | ||
__entry->counter, | ||
__entry->xfeatures, | ||
__entry->xcomp_bv | ||
) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_state, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_before_save, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_after_save, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_before_restore, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_after_restore, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_regs_activated, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_regs_deactivated, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_activate_state, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_deactivate_state, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_init_state, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_dropped, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_copy_src, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_copy_dst, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
DEFINE_EVENT(x86_fpu, x86_fpu_xstate_check_failed, | ||
TP_PROTO(struct fpu *fpu), | ||
TP_ARGS(fpu) | ||
); | ||
|
||
#undef TRACE_INCLUDE_PATH | ||
#define TRACE_INCLUDE_PATH asm/trace/ | ||
#undef TRACE_INCLUDE_FILE | ||
#define TRACE_INCLUDE_FILE fpu | ||
#endif /* _TRACE_FPU_H */ | ||
|
||
/* This part must be outside protection */ | ||
#include <trace/define_trace.h> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters