All of lore.kernel.org
 help / color / mirror / Atom feed
From: takahiro.akashi@linaro.org (AKASHI Takahiro)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v5 2/6] arm64: ftrace: fix a stack tracer's output under function graph tracer
Date: Tue, 10 Nov 2015 11:42:31 +0900	[thread overview]
Message-ID: <56415997.1040207@linaro.org> (raw)
In-Reply-To: <3F63B5BC-C21A-4ECA-9800-374B924DB98D@gmail.com>

On 11/09/2015 11:04 PM, Jungseok Lee wrote:
> On Nov 6, 2015, at 3:44 PM, AKASHI Takahiro wrote:
>
> Hi Akashi,
>
>> Function graph tracer modifies a return address (LR) in a stack frame
>> to hook a function return. This will result in many useless entries
>> (return_to_handler) showing up in a stack tracer's output.
>>
>> This patch replaces such entries with originals values preserved in
>> current->ret_stack[].
>>
>> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
>> ---
>> arch/arm64/include/asm/ftrace.h |    2 ++
>> arch/arm64/kernel/stacktrace.c  |   21 +++++++++++++++++++++
>> 2 files changed, 23 insertions(+)
>>
>> diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h
>> index c5534fa..3c60f37 100644
>> --- a/arch/arm64/include/asm/ftrace.h
>> +++ b/arch/arm64/include/asm/ftrace.h
>> @@ -28,6 +28,8 @@ struct dyn_arch_ftrace {
>>
>> extern unsigned long ftrace_graph_call;
>>
>> +extern void return_to_handler(void);
>> +
>> static inline unsigned long ftrace_call_adjust(unsigned long addr)
>> {
>> 	/*
>> diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
>> index ccb6078..5fd3477 100644
>> --- a/arch/arm64/kernel/stacktrace.c
>> +++ b/arch/arm64/kernel/stacktrace.c
>> @@ -17,6 +17,7 @@
>>   */
>> #include <linux/kernel.h>
>> #include <linux/export.h>
>> +#include <linux/ftrace.h>
>> #include <linux/sched.h>
>> #include <linux/stacktrace.h>
>>
>> @@ -73,6 +74,9 @@ struct stack_trace_data {
>> 	struct stack_trace *trace;
>> 	unsigned int no_sched_functions;
>> 	unsigned int skip;
>> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
>> +	unsigned int ret_stack_index;
>> +#endif
>> };
>>
>> static int save_trace(struct stackframe *frame, void *d)
>> @@ -81,6 +85,20 @@ static int save_trace(struct stackframe *frame, void *d)
>> 	struct stack_trace *trace = data->trace;
>> 	unsigned long addr = frame->pc;
>>
>> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
>> +	if (addr == (unsigned long)return_to_handler - AARCH64_INSN_SIZE) {
>
> not if (adds == (unsigned long)return_to_handler)?
>
>> +		/*
>> +		 * This is a case where function graph tracer has
>> +		 * modified a return address (LR) in a stack frame
>> +		 * to hook a function return.
>> +		 * So replace it to an original value.
>> +		 */
>> +		frame->pc = addr =
>> +			current->ret_stack[data->ret_stack_index--].ret
>> +							- AARCH64_INSN_SIZE;
>
> Ditto. not without AARCH64_INSN_SIZE?
>
> I've observed many return_to_handler without the changes.
> Am I missing something?

You're right!
I thought I had tested the patches, but...

>> +	}
>> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
>> +
>> 	if (data->no_sched_functions && in_sched_functions(addr))
>> 		return 0;
>> 	if (data->skip) {
>> @@ -100,6 +118,9 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
>>
>> 	data.trace = trace;
>> 	data.skip = trace->skip;
>> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
>> +	data.ret_stack_index = current->curr_ret_stack;
>
> Can I get an idea on why current->curr_ret_stack is used instead of
> tsk->curr_ret_stack?

Thanks for pointing this out.
Will fix it although it works without a change since save_stack_trace_sp() is
called only in a 'current task' context.

-Takahiro AKASHI

> Best Regards
> Jungseok Lee
>

WARNING: multiple messages have this Message-ID (diff)
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: Jungseok Lee <jungseoklee85@gmail.com>
Cc: catalin.marinas@arm.com, will.deacon@arm.com,
	rostedt@goodmis.org, broonie@kernel.org, david.griego@linaro.org,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5 2/6] arm64: ftrace: fix a stack tracer's output under function graph tracer
Date: Tue, 10 Nov 2015 11:42:31 +0900	[thread overview]
Message-ID: <56415997.1040207@linaro.org> (raw)
In-Reply-To: <3F63B5BC-C21A-4ECA-9800-374B924DB98D@gmail.com>

On 11/09/2015 11:04 PM, Jungseok Lee wrote:
> On Nov 6, 2015, at 3:44 PM, AKASHI Takahiro wrote:
>
> Hi Akashi,
>
>> Function graph tracer modifies a return address (LR) in a stack frame
>> to hook a function return. This will result in many useless entries
>> (return_to_handler) showing up in a stack tracer's output.
>>
>> This patch replaces such entries with originals values preserved in
>> current->ret_stack[].
>>
>> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
>> ---
>> arch/arm64/include/asm/ftrace.h |    2 ++
>> arch/arm64/kernel/stacktrace.c  |   21 +++++++++++++++++++++
>> 2 files changed, 23 insertions(+)
>>
>> diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h
>> index c5534fa..3c60f37 100644
>> --- a/arch/arm64/include/asm/ftrace.h
>> +++ b/arch/arm64/include/asm/ftrace.h
>> @@ -28,6 +28,8 @@ struct dyn_arch_ftrace {
>>
>> extern unsigned long ftrace_graph_call;
>>
>> +extern void return_to_handler(void);
>> +
>> static inline unsigned long ftrace_call_adjust(unsigned long addr)
>> {
>> 	/*
>> diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
>> index ccb6078..5fd3477 100644
>> --- a/arch/arm64/kernel/stacktrace.c
>> +++ b/arch/arm64/kernel/stacktrace.c
>> @@ -17,6 +17,7 @@
>>   */
>> #include <linux/kernel.h>
>> #include <linux/export.h>
>> +#include <linux/ftrace.h>
>> #include <linux/sched.h>
>> #include <linux/stacktrace.h>
>>
>> @@ -73,6 +74,9 @@ struct stack_trace_data {
>> 	struct stack_trace *trace;
>> 	unsigned int no_sched_functions;
>> 	unsigned int skip;
>> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
>> +	unsigned int ret_stack_index;
>> +#endif
>> };
>>
>> static int save_trace(struct stackframe *frame, void *d)
>> @@ -81,6 +85,20 @@ static int save_trace(struct stackframe *frame, void *d)
>> 	struct stack_trace *trace = data->trace;
>> 	unsigned long addr = frame->pc;
>>
>> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
>> +	if (addr == (unsigned long)return_to_handler - AARCH64_INSN_SIZE) {
>
> not if (adds == (unsigned long)return_to_handler)?
>
>> +		/*
>> +		 * This is a case where function graph tracer has
>> +		 * modified a return address (LR) in a stack frame
>> +		 * to hook a function return.
>> +		 * So replace it to an original value.
>> +		 */
>> +		frame->pc = addr =
>> +			current->ret_stack[data->ret_stack_index--].ret
>> +							- AARCH64_INSN_SIZE;
>
> Ditto. not without AARCH64_INSN_SIZE?
>
> I've observed many return_to_handler without the changes.
> Am I missing something?

You're right!
I thought I had tested the patches, but...

>> +	}
>> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
>> +
>> 	if (data->no_sched_functions && in_sched_functions(addr))
>> 		return 0;
>> 	if (data->skip) {
>> @@ -100,6 +118,9 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
>>
>> 	data.trace = trace;
>> 	data.skip = trace->skip;
>> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
>> +	data.ret_stack_index = current->curr_ret_stack;
>
> Can I get an idea on why current->curr_ret_stack is used instead of
> tsk->curr_ret_stack?

Thanks for pointing this out.
Will fix it although it works without a change since save_stack_trace_sp() is
called only in a 'current task' context.

-Takahiro AKASHI

> Best Regards
> Jungseok Lee
>

  reply	other threads:[~2015-11-10  2:42 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-06  6:44 [PATCH v5 0/6] arm64: ftrace: fix incorrect output from stack tracer AKASHI Takahiro
2015-11-06  6:44 ` AKASHI Takahiro
2015-11-06  6:44 ` [PATCH v5 1/6] arm64: ftrace: modify a stack frame in a safe way AKASHI Takahiro
2015-11-06  6:44   ` AKASHI Takahiro
2015-11-06  6:44 ` [PATCH v5 2/6] arm64: ftrace: fix a stack tracer's output under function graph tracer AKASHI Takahiro
2015-11-06  6:44   ` AKASHI Takahiro
2015-11-09 14:04   ` Jungseok Lee
2015-11-09 14:04     ` Jungseok Lee
2015-11-10  2:42     ` AKASHI Takahiro [this message]
2015-11-10  2:42       ` AKASHI Takahiro
2015-11-13 15:01       ` Jungseok Lee
2015-11-13 15:01         ` Jungseok Lee
2015-11-16  9:23         ` AKASHI Takahiro
2015-11-16  9:23           ` AKASHI Takahiro
2015-11-06  6:44 ` [PATCH v5 3/6] ftrace: allow arch-specific stack tracer AKASHI Takahiro
2015-11-06  6:44   ` AKASHI Takahiro
2015-11-06 13:39   ` Steven Rostedt
2015-11-06 13:39     ` Steven Rostedt
2015-11-06  6:44 ` [PATCH v5 4/6] arm64: insn: add instruction decoders for ldp/stp and add/sub AKASHI Takahiro
2015-11-06  6:44   ` AKASHI Takahiro
2015-11-10 13:40   ` Jungseok Lee
2015-11-10 13:40     ` Jungseok Lee
2015-11-11  4:54     ` AKASHI Takahiro
2015-11-11  4:54       ` AKASHI Takahiro
2015-11-06  6:44 ` [PATCH v5 5/6] arm64: ftrace: add arch-specific stack tracer AKASHI Takahiro
2015-11-06  6:44   ` AKASHI Takahiro
2015-11-10 14:05   ` Jungseok Lee
2015-11-10 14:05     ` Jungseok Lee
2015-11-11  5:03     ` AKASHI Takahiro
2015-11-11  5:03       ` AKASHI Takahiro
2015-11-11 22:56       ` Jungseok Lee
2015-11-11 22:56         ` Jungseok Lee
2015-11-06  6:44 ` [PATCH v5 6/6] arm64: ftrace: add a test of function prologue analyzer AKASHI Takahiro
2015-11-06  6:44   ` AKASHI Takahiro
2015-11-09 14:24 ` [PATCH v5 0/6] arm64: ftrace: fix incorrect output from stack tracer Jungseok Lee
2015-11-09 14:24   ` Jungseok Lee
2015-11-10  2:58   ` AKASHI Takahiro
2015-11-10  2:58     ` AKASHI Takahiro
2015-11-10 13:32     ` Jungseok Lee
2015-11-10 13:32       ` 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=56415997.1040207@linaro.org \
    --to=takahiro.akashi@linaro.org \
    --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.