mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jungseok Lee <jungseoklee85@gmail.com>
To: AKASHI Takahiro <takahiro.akashi@linaro.org>
Cc: catalin.marinas@arm.com, will.deacon@arm.com,
	rostedt@goodmis.org, olof@lixom.net, broonie@kernel.org,
	david.griego@linaro.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 1/7] arm64: ftrace: adjust callsite addresses examined by stack tracer
Date: Wed, 14 Oct 2015 00:15:54 +0900	[thread overview]
Message-ID: <BB42EDAB-830D-4073-859A-6454E6B9EB4D@gmail.com> (raw)
In-Reply-To: <1444298504-10392-2-git-send-email-takahiro.akashi@linaro.org>

On Oct 8, 2015, at 7:01 PM, AKASHI Takahiro wrote:

Hi Akashi,

> On arm64, no PC values returned by save_stack_trace() will match to LR
> values saved in stack frames on a stack after the following commit:
>    commit e306dfd06fcb ("ARM64: unwind: Fix PC calculation")
> As a result, the output from stack tracer will be messed up.
> 
> This patch introduces an arch-defined macro, FTRACE_STACK_FRAME_OFFSET,
> so that check_stack() can handle this case correctly.
> 
> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> ---
> arch/arm64/include/asm/ftrace.h |    5 +++--
> arch/arm64/kernel/stacktrace.c  |    7 ++++---
> include/linux/ftrace.h          |    7 +++++++
> kernel/trace/trace_stack.c      |    5 +++--
> 4 files changed, 17 insertions(+), 7 deletions(-)
> 
> diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h
> index c5534fa..2b43e20 100644
> --- a/arch/arm64/include/asm/ftrace.h
> +++ b/arch/arm64/include/asm/ftrace.h
> @@ -13,8 +13,9 @@
> 
> #include <asm/insn.h>
> 
> -#define MCOUNT_ADDR		((unsigned long)_mcount)
> -#define MCOUNT_INSN_SIZE	AARCH64_INSN_SIZE
> +#define MCOUNT_ADDR			((unsigned long)_mcount)
> +#define MCOUNT_INSN_SIZE		AARCH64_INSN_SIZE
> +#define FTRACE_STACK_FRAME_OFFSET	AARCH64_INSN_SIZE
> 
> #ifndef __ASSEMBLY__
> #include <linux/compat.h>
> diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
> index 407991b..bc0689a 100644
> --- a/arch/arm64/kernel/stacktrace.c
> +++ b/arch/arm64/kernel/stacktrace.c
> @@ -20,6 +20,7 @@
> #include <linux/sched.h>
> #include <linux/stacktrace.h>
> 
> +#include <asm/insn.h>
> #include <asm/stacktrace.h>
> 
> /*
> @@ -49,10 +50,10 @@ int notrace unwind_frame(struct stackframe *frame)
> 	frame->sp = fp + 0x10;
> 	frame->fp = *(unsigned long *)(fp);
> 	/*
> -	 * -4 here because we care about the PC at time of bl,
> -	 * not where the return will go.
> +	 * decrement PC by AARCH64_INSN_SIZE here because we care about
> +	 * the PC at time of bl, not where the return will go.
> 	 */
> -	frame->pc = *(unsigned long *)(fp + 8) - 4;
> +	frame->pc = *(unsigned long *)(fp + 8) - AARCH64_INSN_SIZE;
> 
> 	return 0;
> }
> diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
> index 6cd8c0e..d77b195 100644
> --- a/include/linux/ftrace.h
> +++ b/include/linux/ftrace.h
> @@ -263,6 +263,13 @@ static inline void ftrace_kill(void) { }
> #endif /* CONFIG_FUNCTION_TRACER */
> 
> #ifdef CONFIG_STACK_TRACER
> +/*
> + * the offset value to add to return address from save_stack_trace()
> + */
> +#ifndef FTRACE_STACK_FRAME_OFFSET
> +#define FTRACE_STACK_FRAME_OFFSET 0
> +#endif
> +
> extern int stack_tracer_enabled;
> int
> stack_trace_sysctl(struct ctl_table *table, int write,
> diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c
> index b746399..30521ea 100644
> --- a/kernel/trace/trace_stack.c
> +++ b/kernel/trace/trace_stack.c
> @@ -105,7 +105,7 @@ check_stack(unsigned long ip, unsigned long *stack)
> 
> 	/* Skip over the overhead of the stack tracer itself */
> 	for (i = 0; i < max_stack_trace.nr_entries; i++) {
> -		if (stack_dump_trace[i] == ip)
> +		if ((stack_dump_trace[i] + FTRACE_STACK_FRAME_OFFSET) == ip)
> 			break;
> 	}
> 
> @@ -133,7 +133,8 @@ check_stack(unsigned long ip, unsigned long *stack)
> 		for (; p < top && i < max_stack_trace.nr_entries; p++) {
> 			if (stack_dump_trace[i] == ULONG_MAX)
> 				break;
> -			if (*p == stack_dump_trace[i]) {
> +			if (*p == (stack_dump_trace[i]
> +					+ FTRACE_STACK_FRAME_OFFSET)) {
> 				stack_dump_trace[x] = stack_dump_trace[i++];
> 				this_size = stack_dump_index[x++] =
> 					(top - p) * sizeof(unsigned long);
> -- 

This change is always on my tree for IRQ stack feature development. It makes
stack_trace prints out useful info although it can't give an accurate data.
I believe this hunk helps to figure out max stack depth context.

Acked-by: Jungseok Lee <jungseoklee85@gmail.com>

Thanks!

Best Regards
Jungseok Lee

  reply	other threads:[~2015-10-13 15:16 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-08 10:01 [PATCH v3 0/7] arm64: ftrace: fix incorrect output from " AKASHI Takahiro
2015-10-08 10:01 ` [PATCH v3 1/7] arm64: ftrace: adjust callsite addresses examined by " AKASHI Takahiro
2015-10-13 15:15   ` Jungseok Lee [this message]
2015-10-13 15:37   ` Steven Rostedt
2015-10-14  5:09     ` AKASHI Takahiro
2015-10-08 10:01 ` [PATCH v3 2/7] arm64: ftrace: modify a stack frame in a safe way AKASHI Takahiro
2015-10-08 10:01 ` [PATCH v3 3/7] arm64: ftrace: fix a stack tracer's output under function graph tracer AKASHI Takahiro
2015-10-09  6:46   ` kbuild test robot
2015-10-13 15:24   ` Jungseok Lee
2015-10-14  5:03     ` AKASHI Takahiro
2015-10-08 10:01 ` [PATCH v3 4/7] arm64: ftrace: allow for tracing leaf functions AKASHI Takahiro
2015-10-08 10:01 ` [PATCH v3 5/7] ftrace: allow arch-specific stack tracer AKASHI Takahiro
2015-10-13 15:45   ` Steven Rostedt
2015-10-08 10:01 ` [PATCH v3 6/7] arm64: insn: add instruction decoders for ldp/stp and add/sub AKASHI Takahiro
2015-10-08 10:01 ` [PATCH v3 7/7] arm64: ftrace: add arch-specific stack tracer AKASHI Takahiro
2015-10-09  6:41   ` kbuild test robot
2015-10-08 14:45 ` [PATCH v3 0/7] arm64: ftrace: fix incorrect output from " Jungseok Lee
2015-10-22 14:05   ` Jungseok Lee
2015-10-28 15:23 ` Will Deacon
2015-10-29  5:24   ` AKASHI Takahiro

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=BB42EDAB-830D-4073-859A-6454E6B9EB4D@gmail.com \
    --to=jungseoklee85@gmail.com \
    --cc=broonie@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=david.griego@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=olof@lixom.net \
    --cc=rostedt@goodmis.org \
    --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

all inboxes | Powered by JetHome®