* David Sharp <dhsh...@google.com> wrote: > In order to promote interoperability between userspace tracers and ftrace, > add a trace_clock that reports raw TSC values which will then be recorded > in the ring buffer. Userspace tracers that also record TSCs are then on > exactly the same time base as the kernel and events can be unambiguously > interlaced. > > Tested: Enabled a tracepoint and the "tsc" trace_clock and saw very large > timestamp values. > > v2: > Move arch-specific bits out of generic code. > > Google-Bug-Id: 6980623 > Signed-off-by: David Sharp <dhsh...@google.com> > Cc: Steven Rostedt <rost...@goodmis.org> > Cc: Masami Hiramatsu <masami.hiramatsu...@hitachi.com> > Cc: Ingo Molnar <mi...@kernel.org> > Cc: Thomas Gleixner <t...@linutronix.de> > Cc: "H. Peter Anvin" <h...@linux.intel.com> > --- > arch/x86/include/asm/trace_clock.h | 16 ++++++++++++++++ > arch/x86/kernel/Makefile | 1 + > arch/x86/kernel/trace_clock.c | 20 ++++++++++++++++++++ > include/asm-generic/trace_clock.h | 15 +++++++++++++++ > include/linux/trace_clock.h | 2 ++ > kernel/trace/trace.c | 1 + > 6 files changed, 55 insertions(+), 0 deletions(-) > create mode 100644 arch/x86/include/asm/trace_clock.h > create mode 100644 arch/x86/kernel/trace_clock.c > create mode 100644 include/asm-generic/trace_clock.h > > diff --git a/arch/x86/include/asm/trace_clock.h > b/arch/x86/include/asm/trace_clock.h > new file mode 100644 > index 0000000..0b1f391 > --- /dev/null > +++ b/arch/x86/include/asm/trace_clock.h > @@ -0,0 +1,16 @@ > +#ifndef _ASM_X86_TRACE_CLOCK_H > +#define _ASM_X86_TRACE_CLOCK_H > + > +#include <linux/compiler.h> > +#include <linux/types.h> > + > +#ifdef CONFIG_X86_TSC > + > +extern u64 notrace trace_clock_x86_tsc(void); > + > +# define ARCH_TRACE_CLOCKS \ > + { trace_clock_x86_tsc, "tsc" },
I'd name it "x86-tsc", to make sure the naming is unique. That will also enable the addition of other hw clocks, should the need arise. > + > +#endif > + > +#endif /* _ASM_X86_TRACE_CLOCK_H */ > diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile > index 8215e56..0ee9344 100644 > --- a/arch/x86/kernel/Makefile > +++ b/arch/x86/kernel/Makefile > @@ -62,6 +62,7 @@ obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups_32.o > obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o > obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o > obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o > +obj-$(CONFIG_X86_TSC) += trace_clock.o > obj-$(CONFIG_KEXEC) += machine_kexec_$(BITS).o > obj-$(CONFIG_KEXEC) += relocate_kernel_$(BITS).o crash.o > obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o > diff --git a/arch/x86/kernel/trace_clock.c b/arch/x86/kernel/trace_clock.c > new file mode 100644 > index 0000000..b8959f8 > --- /dev/null > +++ b/arch/x86/kernel/trace_clock.c > @@ -0,0 +1,20 @@ > +/* > + * X86 trace clocks > + */ > +#include <asm/trace_clock.h> > +#include <asm/barrier.h> > +#include <asm/msr.h> > + > +/* > + * trace_clock_x86_tsc(): A clock that is just the cycle counter. > + * > + * Unlike the other clocks, this is not in nanoseconds. > + */ > +u64 notrace trace_clock_x86_tsc(void) > +{ > + u64 ret; > + rdtsc_barrier(); Missing newline. > + rdtscll(ret); > + > + return ret; > +} > diff --git a/include/asm-generic/trace_clock.h > b/include/asm-generic/trace_clock.h > new file mode 100644 > index 0000000..648cdcd > --- /dev/null > +++ b/include/asm-generic/trace_clock.h > @@ -0,0 +1,15 @@ > +/* > + * Arch-specific trace clocks. > + */ > +#ifndef _ASM_GENERIC_TRACE_CLOCK_H > +#define _ASM_GENERIC_TRACE_CLOCK_H We typically put header guards to the first and last lines of the file, that way it can be ignored easily. > + > +/* > + * Additional trace clocks added to the trace_clocks > + * array in kernel/trace/trace.c I'd add: "None if the architecture has not defined it." > + */ > +#ifndef ARCH_TRACE_CLOCKS > +# define ARCH_TRACE_CLOCKS > +#endif > + > +#endif /* _ASM_GENERIC_TRACE_CLOCK_H */ > diff --git a/include/linux/trace_clock.h b/include/linux/trace_clock.h > index 4eb4902..d563f37 100644 > --- a/include/linux/trace_clock.h > +++ b/include/linux/trace_clock.h > @@ -12,6 +12,8 @@ > #include <linux/compiler.h> > #include <linux/types.h> > > +#include <asm/trace_clock.h> > + > extern u64 notrace trace_clock_local(void); > extern u64 notrace trace_clock(void); > extern u64 notrace trace_clock_global(void); > diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c > index 5c38c81..92fb08e 100644 > --- a/kernel/trace/trace.c > +++ b/kernel/trace/trace.c > @@ -480,6 +480,7 @@ static struct { > { trace_clock_local, "local" }, > { trace_clock_global, "global" }, > { trace_clock_counter, "counter" }, > + ARCH_TRACE_CLOCKS > }; > Looks useful and good otherwise: Acked-by: Ingo Molnar <mi...@kernel.org> Thanks, Ingo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/