ftrace: Fix function_graph for archs that test ftrace_trace_function
authorRajesh Bhagat <rajesh.lnx@gmail.com>
Fri, 17 Feb 2012 08:29:15 +0000 (13:59 +0530)
committerSteven Rostedt <rostedt@goodmis.org>
Tue, 13 Mar 2012 19:07:37 +0000 (15:07 -0400)
When CONFIG_DYNAMIC_FTRACE is not set, some archs (ARM) test
the variable function_trace_function to determine if it should
call the function tracer. If it is not set to ftrace_stub, then
it will call the function and return, and not call the function
graph tracer.

But some of these archs (ARM) do not have the assembly code
to test if function tracing is enabled or not (quick stop of tracing)
and it calls the helper routine ftrace_test_stop_func() instead.

If function tracer is enabled and then disabled, the variable
ftrace_trace_function is still set to the helper routine
ftrace_test_stop_func(), and not to ftrace_stub. This will
prevent the function graph tracer from ever running.

Output before patch
/debug/tracing # echo function > current_tracer
/debug/tracing # echo function_graph > current_tracer
/debug/tracing # cat trace

Output after patch
/debug/tracing # echo function > current_tracer
/debug/tracing # echo function_graph > current_tracer
/debug/tracing # cat trace
0) ! 253.375 us | } /* irq_enter */
0) | generic_handle_irq() {
0) | handle_fasteoi_irq() {
0) 9.208 us | _raw_spin_lock();
0) | handle_irq_event() {
0) | handle_irq_event_percpu() {

Signed-off-by: Rajesh Bhagat <rajesh.lnx@gmail.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/ftrace.c

index 867bd1dd2dd09250f3a52663844ee1b54435bbd3..0fa92f677c9209e2ed046752752de986e34f071e 100644 (file)
@@ -249,7 +249,8 @@ static void update_ftrace_function(void)
 #else
        __ftrace_trace_function = func;
 #endif
-       ftrace_trace_function = ftrace_test_stop_func;
+       ftrace_trace_function =
+               (func == ftrace_stub) ? func : ftrace_test_stop_func;
 #endif
 }