diff mbox

[v6,1/6] arm64: ftrace: modify a stack frame in a safe way

Message ID 1447828989-4980-2-git-send-email-takahiro.akashi@linaro.org (mailing list archive)
State New, archived
Headers show

Commit Message

AKASHI Takahiro Nov. 18, 2015, 6:43 a.m. UTC
Function graph tracer modifies a return address (LR) in a stack frame by
calling ftrace_prepare_return() in a traced function's function prologue.
The current code does this modification before preserving an original
address at ftrace_push_return_trace() and there is always a small window
of inconsistency when an interrupt occurs.

This doesn't matter, as far as an interrupt stack is introduced, because
stack tracer won't be invoked in an interrupt context. But it would be
better to proactively minimize such a window by moving the LR modification
after ftrace_push_return_trace().

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
---
 arch/arm64/kernel/ftrace.c |   11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

Comments

Jungseok Lee Nov. 24, 2015, 2:22 p.m. UTC | #1
On Nov 18, 2015, at 3:43 PM, AKASHI Takahiro wrote:
> Function graph tracer modifies a return address (LR) in a stack frame by
> calling ftrace_prepare_return() in a traced function's function prologue.
> The current code does this modification before preserving an original
> address at ftrace_push_return_trace() and there is always a small window
> of inconsistency when an interrupt occurs.
> 
> This doesn't matter, as far as an interrupt stack is introduced, because
> stack tracer won't be invoked in an interrupt context. But it would be
> better to proactively minimize such a window by moving the LR modification
> after ftrace_push_return_trace().

There are two statements in my mind: 1)IRQ stack will be introduced on ARM64
in the future and 2)This change makes subtle variance compared to ARM and x86.
I'm not sure about this patch from those perspectives.

However, I have no objection to the change. I will piggyback on other folks
regarding this patch :)

Best Regards
Jungseok Lee
diff mbox

Patch

diff --git a/arch/arm64/kernel/ftrace.c b/arch/arm64/kernel/ftrace.c
index c851be7..314f82d 100644
--- a/arch/arm64/kernel/ftrace.c
+++ b/arch/arm64/kernel/ftrace.c
@@ -125,23 +125,20 @@  void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
 	 * on other archs. It's unlikely on AArch64.
 	 */
 	old = *parent;
-	*parent = return_hooker;
 
 	trace.func = self_addr;
 	trace.depth = current->curr_ret_stack + 1;
 
 	/* Only trace if the calling function expects to */
-	if (!ftrace_graph_entry(&trace)) {
-		*parent = old;
+	if (!ftrace_graph_entry(&trace))
 		return;
-	}
 
 	err = ftrace_push_return_trace(old, self_addr, &trace.depth,
 				       frame_pointer);
-	if (err == -EBUSY) {
-		*parent = old;
+	if (err == -EBUSY)
 		return;
-	}
+	else
+		*parent = return_hooker;
 }
 
 #ifdef CONFIG_DYNAMIC_FTRACE