]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
sparc64: Use ftrace_graph_get_ret_stack() instead of curr_ret_stack
authorSteven Rostedt (VMware) <rostedt@goodmis.org>
Fri, 7 Dec 2018 17:51:27 +0000 (12:51 -0500)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Sat, 22 Dec 2018 13:21:02 +0000 (08:21 -0500)
The structure of the ret_stack array on the task struct is going to
change, and accessing it directly via the curr_ret_stack index will no
longer give the ret_stack entry that holds the return address. To access
that, architectures must now use ftrace_graph_get_ret_stack() to get the
associated ret_stack that matches the saved return address.

Cc: sparclinux@vger.kernel.org
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
arch/sparc/kernel/perf_event.c
arch/sparc/kernel/stacktrace.c
arch/sparc/kernel/traps_64.c

index 47c871394ccb1602d59bca5a3459a7e088df98e0..6de7c684c29ff7ad0d65d51ebe319ee97faea777 100644 (file)
@@ -1767,9 +1767,11 @@ void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry,
                perf_callchain_store(entry, pc);
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
                if ((pc + 8UL) == (unsigned long) &return_to_handler) {
-                       int index = current->curr_ret_stack;
-                       if (current->ret_stack && index >= graph) {
-                               pc = current->ret_stack[index - graph].ret;
+                       struct ftrace_ret_stack *ret_stack;
+                       ret_stack = ftrace_graph_get_ret_stack(current,
+                                                              graph);
+                       if (ret_stack) {
+                               pc = ret_stack->ret;
                                perf_callchain_store(entry, pc);
                                graph++;
                        }
index be4c14cccc05d1a2254215096f1b9dcda70c384a..dd654e651500d3fc4e8e1edc9e0506e639c5d782 100644 (file)
@@ -57,9 +57,11 @@ static void __save_stack_trace(struct thread_info *tp,
                        trace->entries[trace->nr_entries++] = pc;
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
                        if ((pc + 8UL) == (unsigned long) &return_to_handler) {
-                               int index = t->curr_ret_stack;
-                               if (t->ret_stack && index >= graph) {
-                                       pc = t->ret_stack[index - graph].ret;
+                               struct ftrace_ret_stack *ret_stack;
+                               ret_stack = ftrace_graph_get_ret_stack(t,
+                                                                      graph);
+                               if (ret_stack) {
+                                       pc = ret_stack->ret;
                                        if (trace->nr_entries <
                                            trace->max_entries)
                                                trace->entries[trace->nr_entries++] = pc;
index aa624ed79db1ae26893f4df10a31cec140531017..0cd02a64a4514a6d07c65d33c685a92db1cbfdbe 100644 (file)
@@ -2502,9 +2502,10 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp)
                printk(" [%016lx] %pS\n", pc, (void *) pc);
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
                if ((pc + 8UL) == (unsigned long) &return_to_handler) {
-                       int index = tsk->curr_ret_stack;
-                       if (tsk->ret_stack && index >= graph) {
-                               pc = tsk->ret_stack[index - graph].ret;
+                       struct ftrace_ret_stack *ret_stack;
+                       ret_stack = ftrace_graph_get_ret_stack(tsk, graph);
+                       if (ret_stack) {
+                               pc = ret_stack->ret;
                                printk(" [%016lx] %pS\n", pc, (void *) pc);
                                graph++;
                        }