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;
WARNING: multiple messages have this Message-ID (diff)
From: rostedt@goodmis.org (Steven Rostedt) To: linux-arm-kernel@lists.infradead.org Subject: [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;
next prev parent reply other threads:[~2015-07-13 15:24 UTC|newest] Thread overview: 106+ 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 ` 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 5:29 ` AKASHI Takahiro 2015-07-13 15:24 ` Steven Rostedt [this message] 2015-07-13 15:24 ` Steven Rostedt 2015-07-15 0:22 ` AKASHI Takahiro 2015-07-15 0:22 ` AKASHI Takahiro 2015-07-13 5:29 ` [RFC 2/3] arm64: refactor save_stack_trace() AKASHI Takahiro 2015-07-13 5:29 ` AKASHI Takahiro 2015-07-14 12:47 ` Jungseok Lee 2015-07-14 12:47 ` Jungseok Lee 2015-07-14 13:31 ` Steven Rostedt 2015-07-14 13:31 ` Steven Rostedt 2015-07-15 0:20 ` AKASHI Takahiro 2015-07-15 0:20 ` AKASHI Takahiro 2015-07-15 2:51 ` Steven Rostedt 2015-07-15 2:51 ` Steven Rostedt 2015-07-15 11:41 ` AKASHI Takahiro 2015-07-15 11:41 ` AKASHI Takahiro 2015-07-15 14:55 ` Steven Rostedt 2015-07-15 14:55 ` Steven Rostedt 2015-07-15 16:13 ` Steven Rostedt 2015-07-15 16:13 ` Steven Rostedt 2015-07-16 0:27 ` AKASHI Takahiro 2015-07-16 0:27 ` AKASHI Takahiro 2015-07-16 1:08 ` AKASHI Takahiro 2015-07-16 1:08 ` AKASHI Takahiro 2015-07-16 1:38 ` Steven Rostedt 2015-07-16 1:38 ` Steven Rostedt 2015-07-17 10:46 ` Will Deacon 2015-07-17 10:46 ` Will Deacon 2015-07-16 13:29 ` Jungseok Lee 2015-07-16 13:29 ` Jungseok Lee 2015-07-16 13:54 ` Jungseok Lee 2015-07-16 13:54 ` Jungseok Lee 2015-07-16 14:24 ` Steven Rostedt 2015-07-16 14:24 ` Steven Rostedt 2015-07-16 15:01 ` Jungseok Lee 2015-07-16 15:01 ` Jungseok Lee 2015-07-16 15:31 ` Steven Rostedt 2015-07-16 15:31 ` Steven Rostedt 2015-07-16 15:52 ` Jungseok Lee 2015-07-16 15:52 ` Jungseok Lee 2015-07-16 20:22 ` Steven Rostedt 2015-07-16 20:22 ` Steven Rostedt 2015-07-17 2:49 ` AKASHI Takahiro 2015-07-17 2:49 ` AKASHI Takahiro 2015-07-17 3:21 ` Steven Rostedt 2015-07-17 3:21 ` Steven Rostedt 2015-07-16 16:16 ` Steven Rostedt 2015-07-16 16:16 ` Steven Rostedt 2015-07-17 12:40 ` Mark Rutland 2015-07-17 12:40 ` Mark Rutland 2015-07-17 12:51 ` Steven Rostedt 2015-07-17 12:51 ` Steven Rostedt 2015-07-17 13:00 ` Steven Rostedt 2015-07-17 13:00 ` Steven Rostedt 2015-07-17 14:28 ` Jungseok Lee 2015-07-17 14:28 ` Jungseok Lee 2015-07-17 14:41 ` Steven Rostedt 2015-07-17 14:41 ` Steven Rostedt 2015-07-17 14:59 ` Jungseok Lee 2015-07-17 14:59 ` Jungseok Lee 2015-07-17 15:34 ` Jungseok Lee 2015-07-17 15:34 ` Jungseok Lee 2015-07-17 16:01 ` Steven Rostedt 2015-07-17 16:01 ` Steven Rostedt 2015-07-20 16:20 ` Will Deacon 2015-07-20 16:20 ` Will Deacon 2015-07-20 23:53 ` AKASHI Takahiro 2015-07-20 23:53 ` AKASHI Takahiro 2015-07-21 10:26 ` AKASHI Takahiro 2015-07-21 10:26 ` AKASHI Takahiro 2015-07-21 14:34 ` Jungseok Lee 2015-07-21 14:34 ` Jungseok Lee 2015-08-03 9:09 ` Will Deacon 2015-08-03 9:09 ` Will Deacon 2015-08-03 14:01 ` Steven Rostedt 2015-08-03 14:01 ` Steven Rostedt 2015-08-03 14:04 ` Will Deacon 2015-08-03 14:04 ` Will Deacon 2015-08-03 16:30 ` Jungseok Lee 2015-08-03 16:30 ` Jungseok Lee 2015-08-03 16:57 ` Steven Rostedt 2015-08-03 16:57 ` Steven Rostedt 2015-08-03 17:22 ` Jungseok Lee 2015-08-03 17:22 ` Jungseok Lee 2015-08-03 17:32 ` Steven Rostedt 2015-08-03 17:32 ` Steven Rostedt 2015-08-04 7:41 ` AKASHI Takahiro 2015-08-04 7:41 ` AKASHI Takahiro 2015-07-17 2:04 ` AKASHI Takahiro 2015-07-17 2:04 ` AKASHI Takahiro 2015-07-17 14:38 ` Jungseok Lee 2015-07-17 14:38 ` Jungseok Lee 2015-07-16 14:28 ` Mark Rutland 2015-07-16 14:28 ` Mark Rutland 2015-07-16 14:34 ` Steven Rostedt 2015-07-16 14:34 ` Steven Rostedt 2015-07-17 2:09 ` AKASHI Takahiro 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 5:29 ` AKASHI Takahiro 2015-07-13 15:01 ` [RFC 0/3] arm64: ftrace: fix incorrect output from stack tracer Jungseok Lee 2015-07-13 15:01 ` 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: linkBe 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.