linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Steven Rostedt <rostedt@goodmis.org>
To: AKASHI Takahiro <takahiro.akashi@linaro.org>
Cc: catalin.marinas@arm.com, will.deacon@arm.com,
	jungseoklee85@gmail.com, olof@lixom.net, broonie@kernel.org,
	david.griego@linaro.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org
Subject: Re: [RFC 1/3] ftrace: adjust a function's pc to search for in check_stack() for arm64
Date: Mon, 13 Jul 2015 11:24:39 -0400	[thread overview]
Message-ID: <20150713112439.079d275d@gandalf.local.home> (raw)
In-Reply-To: <1436765375-7119-2-git-send-email-takahiro.akashi@linaro.org>

On Mon, 13 Jul 2015 14:29:33 +0900
AKASHI Takahiro <takahiro.akashi@linaro.org> wrote:

> Ftace's stack tracer on arm64 returns wrong information about call stacks:
> 
>         Depth    Size   Location    (50 entries)
>         -----    ----   --------
>   0)     5256       0   notifier_call_chain+0x30/0x94
>   1)     5256       0   ftrace_call+0x0/0x4
>   2)     5256       0   notifier_call_chain+0x2c/0x94
>   3)     5256       0   raw_notifier_call_chain+0x34/0x44
>   4)     5256       0   timekeeping_update.constprop.9+0xb8/0x114
>   5)     5256       0   update_wall_time+0x408/0x6dc
> 
> Most of 'Size' fields are unexpectedly zero.
> 
> This is because stack tracer fails to recognize each function's stack frame
> in check_stack(). Stack tracer searches for a function's pc in the stack
> based on the list returned by save_stack_trace(), but save_stack_trace() on
> arm64 does not return the exact return address saved in a stack frame, but
> a value decrmented by 4 (which means a branch instruction's address).
> This behavior was introduced by
>     commit e306dfd06fcb ("ARM64: unwind: Fix PC calculation")
> 
> So the matching doesn't succeed in most cases.
> 
> This problem can be fixed either by
> a) reverting the commit above
> b) adding an arm64-specific hack to check_patch()
> 
> This patch does b).
> 
> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> ---
>  kernel/trace/trace_stack.c |    4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c
> index 3f34496..7086fc3 100644
> --- a/kernel/trace/trace_stack.c
> +++ b/kernel/trace/trace_stack.c
> @@ -143,7 +143,11 @@ check_stack(unsigned long ip, unsigned long *stack)
>  		p = start;
>  
>  		for (; p < top && i < max_stack_trace.nr_entries; p++) {
> +#ifdef CONFIG_ARM64
> +			if (*p == (stack_dump_trace[i] + 4)) {
> +#else
>  			if (*p == stack_dump_trace[i]) {
> +#endif

Instead of the ugly #ifdef in this code, please add a macro
FTRACE_STACK_FRAME_OFFSET

Then in include/linux/ftrace.h have:

#ifndef FTRACE_STACK_FRAME_OFFSET
# define FTRACE_STACK_FRAME_OFFSET 0
#endif

And in arch/arm64/include/asm/ftrace.h

#define FTRACE_STACK_FRAME_OFFSET 4

And then just do:

	if (*p == (stack_dump_trace[i] + FTRACE_STACK_FRAME_OFFSET)) {

-- Steve

>  				this_size = stack_dump_index[i++] =
>  					(top - p) * sizeof(unsigned long);
>  				found = 1;


  reply	other threads:[~2015-07-13 15:24 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-13  5:29 [RFC 0/3] arm64: ftrace: fix incorrect output from stack tracer AKASHI Takahiro
2015-07-13  5:29 ` [RFC 1/3] ftrace: adjust a function's pc to search for in check_stack() for arm64 AKASHI Takahiro
2015-07-13 15:24   ` Steven Rostedt [this message]
2015-07-15  0:22     ` AKASHI Takahiro
2015-07-13  5:29 ` [RFC 2/3] arm64: refactor save_stack_trace() AKASHI Takahiro
2015-07-14 12:47   ` Jungseok Lee
2015-07-14 13:31     ` Steven Rostedt
2015-07-15  0:20       ` AKASHI Takahiro
2015-07-15  2:51         ` Steven Rostedt
2015-07-15 11:41           ` AKASHI Takahiro
2015-07-15 14:55             ` Steven Rostedt
2015-07-15 16:13               ` Steven Rostedt
2015-07-16  0:27                 ` AKASHI Takahiro
2015-07-16  1:08                   ` AKASHI Takahiro
2015-07-16  1:38                     ` Steven Rostedt
2015-07-17 10:46                       ` Will Deacon
2015-07-16 13:29                     ` Jungseok Lee
2015-07-16 13:54                       ` Jungseok Lee
2015-07-16 14:24                       ` Steven Rostedt
2015-07-16 15:01                         ` Jungseok Lee
2015-07-16 15:31                           ` Steven Rostedt
2015-07-16 15:52                             ` Jungseok Lee
2015-07-16 20:22                               ` Steven Rostedt
2015-07-17  2:49                                 ` AKASHI Takahiro
2015-07-17  3:21                                   ` Steven Rostedt
2015-07-16 16:16                             ` Steven Rostedt
2015-07-17 12:40                               ` Mark Rutland
2015-07-17 12:51                                 ` Steven Rostedt
2015-07-17 13:00                                 ` Steven Rostedt
2015-07-17 14:28                                   ` Jungseok Lee
2015-07-17 14:41                                     ` Steven Rostedt
2015-07-17 14:59                                       ` Jungseok Lee
2015-07-17 15:34                                         ` Jungseok Lee
2015-07-17 16:01                                           ` Steven Rostedt
2015-07-20 16:20                                           ` Will Deacon
2015-07-20 23:53                                             ` AKASHI Takahiro
2015-07-21 10:26                                               ` AKASHI Takahiro
2015-07-21 14:34                                                 ` Jungseok Lee
2015-08-03  9:09                                             ` Will Deacon
2015-08-03 14:01                                               ` Steven Rostedt
2015-08-03 14:04                                                 ` Will Deacon
2015-08-03 16:30                                               ` Jungseok Lee
2015-08-03 16:57                                                 ` Steven Rostedt
2015-08-03 17:22                                                   ` Jungseok Lee
2015-08-03 17:32                                                     ` Steven Rostedt
2015-08-04  7:41                                                       ` AKASHI Takahiro
2015-07-17  2:04                       ` AKASHI Takahiro
2015-07-17 14:38                         ` Jungseok Lee
2015-07-16 14:28                     ` Mark Rutland
2015-07-16 14:34                       ` Steven Rostedt
2015-07-17  2:09                         ` AKASHI Takahiro
2015-07-13  5:29 ` [RFC 3/3] arm64: ftrace: mcount() should not create a stack frame AKASHI Takahiro
2015-07-13 15:01 ` [RFC 0/3] arm64: ftrace: fix incorrect output from stack tracer Jungseok Lee

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=20150713112439.079d275d@gandalf.local.home \
    --to=rostedt@goodmis.org \
    --cc=broonie@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=david.griego@linaro.org \
    --cc=jungseoklee85@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=olof@lixom.net \
    --cc=takahiro.akashi@linaro.org \
    --cc=will.deacon@arm.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).