mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-18 07:35:12 +08:00
tracing,x86: Add a TSC trace_clock
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. v3: Rename "x86-tsc", cleanups v7: Generic arch bits in Kbuild. Google-Bug-Id: 6980623 Link: http://lkml.kernel.org/r/1352837903-32191-1-git-send-email-dhsharp@google.com Acked-by: Ingo Molnar <mingo@kernel.org> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: "H. Peter Anvin" <hpa@linux.intel.com> Signed-off-by: David Sharp <dhsharp@google.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
parent
7bcfaf54f5
commit
8cbd9cc625
@ -11,3 +11,4 @@ header-y += reg.h
|
||||
header-y += regdef.h
|
||||
header-y += sysinfo.h
|
||||
generic-y += exec.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -31,5 +31,6 @@ generic-y += sockios.h
|
||||
generic-y += termbits.h
|
||||
generic-y += termios.h
|
||||
generic-y += timex.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += types.h
|
||||
generic-y += unaligned.h
|
||||
|
@ -43,6 +43,7 @@ generic-y += swab.h
|
||||
generic-y += termbits.h
|
||||
generic-y += termios.h
|
||||
generic-y += topology.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += types.h
|
||||
generic-y += unaligned.h
|
||||
generic-y += user.h
|
||||
|
@ -1,3 +1,4 @@
|
||||
|
||||
generic-y += clkdev.h
|
||||
generic-y += exec.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -38,6 +38,7 @@ generic-y += statfs.h
|
||||
generic-y += termbits.h
|
||||
generic-y += termios.h
|
||||
generic-y += topology.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += types.h
|
||||
generic-y += ucontext.h
|
||||
generic-y += unaligned.h
|
||||
|
@ -49,6 +49,7 @@ generic-y += termbits.h
|
||||
generic-y += termios.h
|
||||
generic-y += tlbflush.h
|
||||
generic-y += topology.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += types.h
|
||||
generic-y += ucontext.h
|
||||
generic-y += user.h
|
||||
|
@ -11,3 +11,4 @@ header-y += sync_serial.h
|
||||
generic-y += clkdev.h
|
||||
generic-y += exec.h
|
||||
generic-y += module.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -1,3 +1,4 @@
|
||||
|
||||
generic-y += clkdev.h
|
||||
generic-y += exec.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -3,3 +3,4 @@ include include/asm-generic/Kbuild.asm
|
||||
generic-y += clkdev.h
|
||||
generic-y += exec.h
|
||||
generic-y += module.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -48,6 +48,7 @@ generic-y += stat.h
|
||||
generic-y += termbits.h
|
||||
generic-y += termios.h
|
||||
generic-y += topology.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += types.h
|
||||
generic-y += ucontext.h
|
||||
generic-y += unaligned.h
|
||||
|
@ -2,3 +2,4 @@
|
||||
generic-y += clkdev.h
|
||||
generic-y += exec.h
|
||||
generic-y += kvm_para.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -3,3 +3,4 @@ include include/asm-generic/Kbuild.asm
|
||||
generic-y += clkdev.h
|
||||
generic-y += exec.h
|
||||
generic-y += module.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -24,6 +24,7 @@ generic-y += sections.h
|
||||
generic-y += siginfo.h
|
||||
generic-y += statfs.h
|
||||
generic-y += topology.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += types.h
|
||||
generic-y += word-at-a-time.h
|
||||
generic-y += xor.h
|
||||
|
@ -3,3 +3,4 @@ include include/asm-generic/Kbuild.asm
|
||||
header-y += elf.h
|
||||
generic-y += clkdev.h
|
||||
generic-y += exec.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -1 +1,2 @@
|
||||
# MIPS headers
|
||||
generic-y += trace_clock.h
|
||||
|
@ -1,3 +1,4 @@
|
||||
|
||||
generic-y += clkdev.h
|
||||
generic-y += exec.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -60,6 +60,7 @@ generic-y += swab.h
|
||||
generic-y += termbits.h
|
||||
generic-y += termios.h
|
||||
generic-y += topology.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += types.h
|
||||
generic-y += ucontext.h
|
||||
generic-y += user.h
|
||||
|
@ -3,3 +3,4 @@ generic-y += word-at-a-time.h auxvec.h user.h cputime.h emergency-restart.h \
|
||||
segment.h topology.h vga.h device.h percpu.h hw_irq.h mutex.h \
|
||||
div64.h irq_regs.h kdebug.h kvm_para.h local64.h local.h param.h \
|
||||
poll.h xor.h clkdev.h exec.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -2,3 +2,4 @@
|
||||
|
||||
generic-y += clkdev.h
|
||||
generic-y += rwsem.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -1,3 +1,4 @@
|
||||
|
||||
|
||||
generic-y += clkdev.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -3,3 +3,4 @@ include include/asm-generic/Kbuild.asm
|
||||
header-y +=
|
||||
|
||||
generic-y += clkdev.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -31,5 +31,6 @@ generic-y += socket.h
|
||||
generic-y += statfs.h
|
||||
generic-y += termbits.h
|
||||
generic-y += termios.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += ucontext.h
|
||||
generic-y += xor.h
|
||||
|
@ -8,4 +8,5 @@ generic-y += local64.h
|
||||
generic-y += irq_regs.h
|
||||
generic-y += local.h
|
||||
generic-y += module.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += word-at-a-time.h
|
||||
|
@ -34,5 +34,6 @@ generic-y += sockios.h
|
||||
generic-y += statfs.h
|
||||
generic-y += termbits.h
|
||||
generic-y += termios.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += types.h
|
||||
generic-y += xor.h
|
||||
|
@ -2,3 +2,4 @@ generic-y += bug.h cputime.h device.h emergency-restart.h futex.h hardirq.h
|
||||
generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h
|
||||
generic-y += ftrace.h pci.h io.h param.h delay.h mutex.h current.h exec.h
|
||||
generic-y += switch_to.h clkdev.h
|
||||
generic-y += trace_clock.h
|
||||
|
@ -54,6 +54,7 @@ generic-y += syscalls.h
|
||||
generic-y += termbits.h
|
||||
generic-y += termios.h
|
||||
generic-y += topology.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += types.h
|
||||
generic-y += ucontext.h
|
||||
generic-y += unaligned.h
|
||||
|
20
arch/x86/include/asm/trace_clock.h
Normal file
20
arch/x86/include/asm/trace_clock.h
Normal file
@ -0,0 +1,20 @@
|
||||
#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, "x86-tsc" },
|
||||
|
||||
#else /* !CONFIG_X86_TSC */
|
||||
|
||||
#define ARCH_TRACE_CLOCKS
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_X86_TRACE_CLOCK_H */
|
@ -61,6 +61,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
|
||||
|
21
arch/x86/kernel/trace_clock.c
Normal file
21
arch/x86/kernel/trace_clock.c
Normal file
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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();
|
||||
rdtscll(ret);
|
||||
|
||||
return ret;
|
||||
}
|
@ -25,4 +25,5 @@ generic-y += siginfo.h
|
||||
generic-y += statfs.h
|
||||
generic-y += termios.h
|
||||
generic-y += topology.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += xor.h
|
||||
|
16
include/asm-generic/trace_clock.h
Normal file
16
include/asm-generic/trace_clock.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef _ASM_GENERIC_TRACE_CLOCK_H
|
||||
#define _ASM_GENERIC_TRACE_CLOCK_H
|
||||
/*
|
||||
* Arch-specific trace clocks.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Additional trace clocks added to the trace_clocks
|
||||
* array in kernel/trace/trace.c
|
||||
* None if the architecture has not defined it.
|
||||
*/
|
||||
#ifndef ARCH_TRACE_CLOCKS
|
||||
# define ARCH_TRACE_CLOCKS
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_GENERIC_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);
|
||||
|
@ -488,6 +488,7 @@ static struct {
|
||||
{ trace_clock_local, "local" },
|
||||
{ trace_clock_global, "global" },
|
||||
{ trace_clock_counter, "counter" },
|
||||
ARCH_TRACE_CLOCKS
|
||||
};
|
||||
|
||||
int trace_clock_id;
|
||||
|
Loading…
Reference in New Issue
Block a user