[PATCH RFC] arm64/ftrace: Define a new arm64 trace clock source based on cntpct_el0 register.

Steven Rostedt rostedt at goodmis.org
Wed Oct 21 06:44:04 PDT 2015


On Sun, 18 Oct 2015 17:47:19 +0530
Amit <amittomer25 at gmail.com> wrote:

> From: Amit Singh Tomar <amittomer25 at gmail.com>
> 
> Currenty, Default trace clock("local") for host and guest is out of sync. 
> This default clock is based on cntvct_el0 register value and both host/guest
> see different values of cntvct_el0.
> 
> Intention here is to get a clock whose timestamps are comparable between host/guest.
> It can be achieved by using clock based on cntpct_el0 register values(host/guest
> see same value of cntpct_el0 register all the time).
> 
> Define a new arm64 specific trace clock using the cntpct_el0 register,
> similar to x86-tsc. It can be used to correlate trace events across
> hosts and guest that can be useful for debuging purpose.
> 
> Signed-off-by: Amit Singh Tomar <amittomer25 at gmail.com>
> ---
>  Documentation/trace/ftrace.txt       |  8 +++++++-
>  arch/arm64/include/asm/Kbuild        |  1 -
>  arch/arm64/include/asm/trace_clock.h | 21 +++++++++++++++++++++
>  arch/arm64/kernel/Makefile           |  1 +
>  arch/arm64/kernel/trace_clock.c      | 23 +++++++++++++++++++++++
>  5 files changed, 52 insertions(+), 2 deletions(-)
>  create mode 100644 arch/arm64/include/asm/trace_clock.h
>  create mode 100644 arch/arm64/kernel/trace_clock.c
> 
> diff --git a/Documentation/trace/ftrace.txt b/Documentation/trace/ftrace.txt
> index ef621d3..6420e32 100644
> --- a/Documentation/trace/ftrace.txt
> +++ b/Documentation/trace/ftrace.txt
> @@ -323,7 +323,7 @@ of ftrace. Here is a list of some of the key files:
>  	Usual clocks for tracing:
>  
>  	  # cat trace_clock
> -	  [local] global counter x86-tsc
> +	  [local] global counter x86-tsc arm64-pct

You don't need to update this line. You can't have both x86-tsc and
arm64-pct at the same time.

>  
>  	  local: Default clock, but may not be in sync across CPUs
>  
> @@ -351,6 +351,12 @@ of ftrace. Here is a list of some of the key files:
>  		  to correlate events across hypervisor/guest if
>  		  tb_offset is known.
>  
> +	arm64-pct: This uses ARM64 Physical Timer Count register
> +		   value. This is different from default "local"
> +		   clock which usese Virtual Timer Count register.
> +		   This is consistent across processors and can be
> +		   used to correlate events across host/guest.
> +
>  	To set a clock, simply echo the clock name into this file.
>  
>  	  echo global > trace_clock
> diff --git a/arch/arm64/include/asm/Kbuild b/arch/arm64/include/asm/Kbuild
> index 70fd9ff..8608f9e 100644
> --- a/arch/arm64/include/asm/Kbuild
> +++ b/arch/arm64/include/asm/Kbuild
> @@ -50,7 +50,6 @@ generic-y += switch_to.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
> diff --git a/arch/arm64/include/asm/trace_clock.h b/arch/arm64/include/asm/trace_clock.h
> new file mode 100644
> index 0000000..aef4ccd
> --- /dev/null
> +++ b/arch/arm64/include/asm/trace_clock.h
> @@ -0,0 +1,21 @@
> +/*
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License, version 2, as
> + * published by the Free Software Foundation.
> + *
> + * Copyright (C) 2015 Amit Singh Tomar, amittomer25 at gmail.com
> +*/
> +
> +#ifndef _ASM_ARM_TRACE_CLOCK_H
> +#define _ASM_ARM_TRACE_CLOCK_H
> +
> +#include <linux/compiler.h>
> +#include <linux/types.h>
> +
> +extern u64 notrace trace_clock_arm64_pct(void);
> +
> +# define ARCH_TRACE_CLOCKS \
> +	{ trace_clock_arm64_pct,  "arm64-pct",  0},
> +
> +#endif  /* _ASM_ARM_TRACE_CLOCK_H */
> +
> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
> index 22dc9bc..d58f885 100644
> --- a/arch/arm64/kernel/Makefile
> +++ b/arch/arm64/kernel/Makefile
> @@ -36,6 +36,7 @@ arm64-obj-$(CONFIG_EFI)			+= efi.o efi-stub.o efi-entry.o
>  arm64-obj-$(CONFIG_PCI)			+= pci.o
>  arm64-obj-$(CONFIG_ARMV8_DEPRECATED)	+= armv8_deprecated.o
>  arm64-obj-$(CONFIG_ACPI)		+= acpi.o
> +arm64-obj-$(CONFIG_TRACING)             += trace_clock.o
>  
>  obj-y					+= $(arm64-obj-y) vdso/
>  obj-m					+= $(arm64-obj-m)
> diff --git a/arch/arm64/kernel/trace_clock.c b/arch/arm64/kernel/trace_clock.c
> new file mode 100644
> index 0000000..f038977
> --- /dev/null
> +++ b/arch/arm64/kernel/trace_clock.c
> @@ -0,0 +1,23 @@
> +/*
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License, version 2, as
> + * published by the Free Software Foundation.
> + *
> + * Copyright (C) 2015 Amit Singh Tomar, amittomer25 at gmail.com
> +*/
> +
> +#include <asm/trace_clock.h>
> +
> +#define read_cnt_pct(cnt_pct) do {				\
> +	__asm__ __volatile("isb; mrs %0, cntpct_el0; isb ;"	\
> +	: "=r" (cnt_pct));					\
> +} while (0)

Why is this a define and not a static inline?

-- Steve

> +
> +u64 notrace trace_clock_arm64_pct(void)
> +{
> +	u64 cnt_pct;
> +
> +	read_cnt_pct(cnt_pct);
> +	return  cnt_pct;
> +}
> +




More information about the linux-arm-kernel mailing list