Skip to content

Commit 166438a

Browse files
committed
ftrace: Do not find "true_parent" if HAVE_DYNAMIC_FTRACE_WITH_ARGS is not set
When function tracing and function graph tracing are both enabled (in different instances) the "parent" of some of the function tracing events is "return_to_handler" which is the trampoline used by function graph tracing. To fix this, ftrace_get_true_parent_ip() was introduced that returns the "true" parent ip instead of the trampoline. To do this, the ftrace_regs_get_stack_pointer() is used, which uses kernel_stack_pointer(). The problem is that microblaze does not implement kerenl_stack_pointer() so when function graph tracing is enabled, the build fails. But microblaze also does not enabled HAVE_DYNAMIC_FTRACE_WITH_ARGS. That option has to be enabled by the architecture to reliably get the values from the fregs parameter passed in. When that config is not set, the architecture can also pass in NULL, which is not tested for in that function and could cause the kernel to crash. Cc: Masami Hiramatsu <[email protected]> Cc: Mathieu Desnoyers <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Al Viro <[email protected]> Cc: Michal Simek <[email protected]> Cc: Jeff Xie <[email protected]> Link: https://lore.kernel.org/[email protected] Fixes: 60b1f57 ("ftrace: Get the true parent ip for function tracer") Reported-by: Al Viro <[email protected]> Signed-off-by: Steven Rostedt (Google) <[email protected]>
1 parent cc252bb commit 166438a

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

kernel/trace/trace_functions.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ static void function_trace_start(struct trace_array *tr)
176176
tracing_reset_online_cpus(&tr->array_buffer);
177177
}
178178

179-
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
179+
/* fregs are guaranteed not to be NULL if HAVE_DYNAMIC_FTRACE_WITH_ARGS is set */
180+
#if defined(CONFIG_FUNCTION_GRAPH_TRACER) && defined(CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS)
180181
static __always_inline unsigned long
181182
function_get_true_parent_ip(unsigned long parent_ip, struct ftrace_regs *fregs)
182183
{

0 commit comments

Comments
 (0)