summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/dumpstack.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c
index 9bf3d021609c..6aad8d4e2ea6 100644
--- a/arch/x86/kernel/dumpstack.c
+++ b/arch/x86/kernel/dumpstack.c
@@ -87,12 +87,21 @@ print_context_stack(struct task_struct *task,
bp = (unsigned long) frame;
}
- ops->address(data, addr, reliable);
-
+ /*
+ * When function graph tracing is enabled for a
+ * function, its return address on the stack is
+ * replaced with the address of an ftrace handler
+ * (return_to_handler). In that case, before printing
+ * the "real" address, we want to print the handler
+ * address as an "unreliable" hint that function graph
+ * tracing was involved.
+ */
real_addr = ftrace_graph_ret_addr(task, graph, addr,
stack);
if (real_addr != addr)
- ops->address(data, real_addr, 1);
+ ops->address(data, addr, 0);
+
+ ops->address(data, real_addr, reliable);
}
stack++;
}
@@ -116,12 +125,11 @@ print_context_stack_bp(struct task_struct *task,
if (!__kernel_text_address(addr))
break;
- if (ops->address(data, addr, 1))
- break;
-
real_addr = ftrace_graph_ret_addr(task, graph, addr, retp);
- if (real_addr != addr)
- ops->address(data, real_addr, 1);
+ if (real_addr != addr && ops->address(data, addr, 0))
+ break;
+ if (ops->address(data, real_addr, 1))
+ break;
frame = frame->next_frame;
retp = &frame->return_address;