All of lore.kernel.org
 help / color / mirror / Atom feed
From: will.deacon@arm.com (Will Deacon)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2] arm & arm64: perf: Fix callchain parse error with kernel tracepoint events
Date: Fri, 1 May 2015 17:43:38 +0100	[thread overview]
Message-ID: <20150501164338.GE25524@arm.com> (raw)
In-Reply-To: <1430402332-52750-1-git-send-email-houpengyang@huawei.com>

On Thu, Apr 30, 2015 at 02:58:52PM +0100, Hou Pengyang wrote:
> For ARM & ARM64, when tracing with tracepoint events, the IP and cpsr are 
> set to 0, preventing the perf code parsing the callchain and resolving the 
> symbols correctly.
> 
>  ./perf record -e sched:sched_switch -g --call-graph dwarf ls
>     [ perf record: Captured and wrote 0.146 MB perf.data ]
>  ./perf report -f
>     Samples: 194  of event 'sched:sched_switch', Event count (approx.): 194 
>     Children      Self    Command  Shared Object     Symbol
>     100.00%       100.00%  ls       [unknown]         [.] 0000000000000000
> 
> The fix is to implement perf_arch_fetch_caller_regs for ARM64, which fills
> several necessary registers used for callchain unwinding, including pc,sp,
> fp and psr .

Thanks for the v2.

> With this patch, callchain can be parsed correctly as follows:
> 
>      ......
> +    2.63%     0.00%  ls       [kernel.kallsyms]  [k] vfs_symlink
> +    2.63%     0.00%  ls       [kernel.kallsyms]  [k] follow_down
> +    2.63%     0.00%  ls       [kernel.kallsyms]  [k] pfkey_get
> +    2.63%     0.00%  ls       [kernel.kallsyms]  [k] do_execveat_common.isra.33
> -    2.63%     0.00%  ls       [kernel.kallsyms]  [k] pfkey_send_policy_notify
>      pfkey_send_policy_notify
>      pfkey_get
>      v9fs_vfs_rename
>      page_follow_link_light
>      link_path_walk
>      el0_svc_naked
>     .......
> 
> Jean Pihet found this in ARM and come up with a patch:
> http://thread.gmane.org/gmane.linux.kernel/1734283/focus=1734280
> 
> Signed-off-by: Hou Pengyang <houpengyang@huawei.com>
> ---
>  arch/arm/include/asm/perf_event.h   | 7 +++++++
>  arch/arm64/include/asm/perf_event.h | 7 +++++++
>  2 files changed, 14 insertions(+)

Can you split this into two patches, please?

> diff --git a/arch/arm/include/asm/perf_event.h b/arch/arm/include/asm/perf_event.h
> index d9cf138..17705e2b 100644
> --- a/arch/arm/include/asm/perf_event.h
> +++ b/arch/arm/include/asm/perf_event.h
> @@ -19,4 +19,11 @@ extern unsigned long perf_misc_flags(struct pt_regs *regs);
>  #define perf_misc_flags(regs)	perf_misc_flags(regs)
>  #endif
>  
> +#define perf_arch_fetch_caller_regs(regs, __ip) { \
> +    (regs)->ARM_pc = (__ip); \
> +    (regs)->ARM_fp = (unsigned long) __builtin_frame_address(0); \
> +    (regs)->ARM_sp = current_stack_pointer; \
> +    (regs)->ARM_cpsr |= SYSTEM_MODE; \

You don't need to |= (just = is fine, perf memset's the thing to 0 anyway)
and this should be SVC_MODE not SYSTEM_MODE.

> +}
> +
>  #endif /* __ARM_PERF_EVENT_H__ */
> diff --git a/arch/arm64/include/asm/perf_event.h b/arch/arm64/include/asm/perf_event.h
> index d26d1d5..e6911a4 100644
> --- a/arch/arm64/include/asm/perf_event.h
> +++ b/arch/arm64/include/asm/perf_event.h
> @@ -24,4 +24,11 @@ extern unsigned long perf_misc_flags(struct pt_regs *regs);
>  #define perf_misc_flags(regs)	perf_misc_flags(regs)
>  #endif
> 	 
> +#define perf_arch_fetch_caller_regs(regs, __ip) { \
> +    (regs)->ARM_pc = (__ip);    \
> +    (regs)->ARM_fp = (unsigned long) __builtin_frame_address(0); \
> +    (regs)->ARM_sp = current_stack_pointer; \
> +    (regs)->ARM_cpsr |= PSR_MODE_EL1h;	\

Similarly here, just use an assignment.

Will

WARNING: multiple messages have this Message-ID (diff)
From: Will Deacon <will.deacon@arm.com>
To: Hou Pengyang <houpengyang@huawei.com>
Cc: "a.p.zijlstra@chello.nl" <a.p.zijlstra@chello.nl>,
	"paulus@samba.org" <paulus@samba.org>,
	"acme@kernel.org" <acme@kernel.org>,
	"mingo@redhat.com" <mingo@redhat.com>,
	"wannan0@huawei.com" <wannan0@huawei.com>,
	Catalin Marinas <Catalin.Marinas@arm.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v2] arm & arm64: perf: Fix callchain parse error with kernel tracepoint events
Date: Fri, 1 May 2015 17:43:38 +0100	[thread overview]
Message-ID: <20150501164338.GE25524@arm.com> (raw)
In-Reply-To: <1430402332-52750-1-git-send-email-houpengyang@huawei.com>

On Thu, Apr 30, 2015 at 02:58:52PM +0100, Hou Pengyang wrote:
> For ARM & ARM64, when tracing with tracepoint events, the IP and cpsr are 
> set to 0, preventing the perf code parsing the callchain and resolving the 
> symbols correctly.
> 
>  ./perf record -e sched:sched_switch -g --call-graph dwarf ls
>     [ perf record: Captured and wrote 0.146 MB perf.data ]
>  ./perf report -f
>     Samples: 194  of event 'sched:sched_switch', Event count (approx.): 194 
>     Children      Self    Command  Shared Object     Symbol
>     100.00%       100.00%  ls       [unknown]         [.] 0000000000000000
> 
> The fix is to implement perf_arch_fetch_caller_regs for ARM64, which fills
> several necessary registers used for callchain unwinding, including pc,sp,
> fp and psr .

Thanks for the v2.

> With this patch, callchain can be parsed correctly as follows:
> 
>      ......
> +    2.63%     0.00%  ls       [kernel.kallsyms]  [k] vfs_symlink
> +    2.63%     0.00%  ls       [kernel.kallsyms]  [k] follow_down
> +    2.63%     0.00%  ls       [kernel.kallsyms]  [k] pfkey_get
> +    2.63%     0.00%  ls       [kernel.kallsyms]  [k] do_execveat_common.isra.33
> -    2.63%     0.00%  ls       [kernel.kallsyms]  [k] pfkey_send_policy_notify
>      pfkey_send_policy_notify
>      pfkey_get
>      v9fs_vfs_rename
>      page_follow_link_light
>      link_path_walk
>      el0_svc_naked
>     .......
> 
> Jean Pihet found this in ARM and come up with a patch:
> http://thread.gmane.org/gmane.linux.kernel/1734283/focus=1734280
> 
> Signed-off-by: Hou Pengyang <houpengyang@huawei.com>
> ---
>  arch/arm/include/asm/perf_event.h   | 7 +++++++
>  arch/arm64/include/asm/perf_event.h | 7 +++++++
>  2 files changed, 14 insertions(+)

Can you split this into two patches, please?

> diff --git a/arch/arm/include/asm/perf_event.h b/arch/arm/include/asm/perf_event.h
> index d9cf138..17705e2b 100644
> --- a/arch/arm/include/asm/perf_event.h
> +++ b/arch/arm/include/asm/perf_event.h
> @@ -19,4 +19,11 @@ extern unsigned long perf_misc_flags(struct pt_regs *regs);
>  #define perf_misc_flags(regs)	perf_misc_flags(regs)
>  #endif
>  
> +#define perf_arch_fetch_caller_regs(regs, __ip) { \
> +    (regs)->ARM_pc = (__ip); \
> +    (regs)->ARM_fp = (unsigned long) __builtin_frame_address(0); \
> +    (regs)->ARM_sp = current_stack_pointer; \
> +    (regs)->ARM_cpsr |= SYSTEM_MODE; \

You don't need to |= (just = is fine, perf memset's the thing to 0 anyway)
and this should be SVC_MODE not SYSTEM_MODE.

> +}
> +
>  #endif /* __ARM_PERF_EVENT_H__ */
> diff --git a/arch/arm64/include/asm/perf_event.h b/arch/arm64/include/asm/perf_event.h
> index d26d1d5..e6911a4 100644
> --- a/arch/arm64/include/asm/perf_event.h
> +++ b/arch/arm64/include/asm/perf_event.h
> @@ -24,4 +24,11 @@ extern unsigned long perf_misc_flags(struct pt_regs *regs);
>  #define perf_misc_flags(regs)	perf_misc_flags(regs)
>  #endif
> 	 
> +#define perf_arch_fetch_caller_regs(regs, __ip) { \
> +    (regs)->ARM_pc = (__ip);    \
> +    (regs)->ARM_fp = (unsigned long) __builtin_frame_address(0); \
> +    (regs)->ARM_sp = current_stack_pointer; \
> +    (regs)->ARM_cpsr |= PSR_MODE_EL1h;	\

Similarly here, just use an assignment.

Will

  reply	other threads:[~2015-05-01 16:43 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-30 13:58 [PATCH v2] arm & arm64: perf: Fix callchain parse error with kernel tracepoint events Hou Pengyang
2015-04-30 13:58 ` Hou Pengyang
2015-05-01 16:43 ` Will Deacon [this message]
2015-05-01 16:43   ` Will Deacon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150501164338.GE25524@arm.com \
    --to=will.deacon@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.