]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
tracing: Fix ftrace_graph_get_ret_stack() to use task and not current
authorSteven Rostedt (VMware) <rostedt@goodmis.org>
Tue, 18 Dec 2018 20:50:02 +0000 (15:50 -0500)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Sat, 22 Dec 2018 13:21:03 +0000 (08:21 -0500)
The function ftrace_graph_get_ret_stack() takes a task struct descriptor but
uses current as the task to perform the operations on. In pretty much all
cases the task decriptor is the same as current, so this wasn't an issue.
But there is a case in the ARM architecture that passes in a task that is
not current, and expects a result from that task, and this code breaks it.

Fixes: 51584396cff5 ("arm64: Use ftrace_graph_get_ret_stack() instead of curr_ret_stack")
Reported-by: James Morse <james.morse@arm.com>
Tested-by: James Morse <james.morse@arm.com>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
kernel/trace/fgraph.c

index d4f04f0ca64626ab7eb3f9bac2856b312f92213a..8dfd5021b9339ac2c5369607528fdadc4f8f64d1 100644 (file)
@@ -246,10 +246,10 @@ unsigned long ftrace_return_to_handler(unsigned long frame_pointer)
 struct ftrace_ret_stack *
 ftrace_graph_get_ret_stack(struct task_struct *task, int idx)
 {
-       idx = current->curr_ret_stack - idx;
+       idx = task->curr_ret_stack - idx;
 
        if (idx >= 0 && idx <= task->curr_ret_stack)
-               return &current->ret_stack[idx];
+               return &task->ret_stack[idx];
 
        return NULL;
 }