On Thu, 13 Nov 2014 09:23:45 +0000 Markos Chandras <Markos.Chandras@xxxxxxxxxx> wrote: > Hi, > > I am trying to understand why ftrace function graph doesn't work when > using static ftrace on MIPS. So, what happens when I do 'echo > function_graph > current_tracer' is that the ftrace_graph_caller from > mcount.S is executed once. The function that called it is > 'core_kernel_data()' from __register_ftrace_function in > kernel/trace/ftrace.c > > However, this is the only function that is reported in the trace file > > # cat trace > # tracer: function_graph > # > # CPU DURATION FUNCTION CALLS > # | | | | | | | > 0) | core_kernel_data() { > 0) 0.000 us | } /* core_kernel_data */ > > The reason that the ftrace_graph_caller is never executed after that is > that the following as far as I understand: > > NESTED(_mcount, PT_SIZE, ra) > PTR_LA t1, ftrace_stub > PTR_L t2, ftrace_trace_function /* Prepare t2 for (1) */ > bne t1, t2, static_trace > nop > > #ifdef CONFIG_FUNCTION_GRAPH_TRACER > PTR_L t3, ftrace_graph_return > bne t1, t3, ftrace_graph_caller > nop > PTR_LA t1, ftrace_graph_entry_stub > PTR_L t3, ftrace_graph_entry > bne t1, t3, ftrace_graph_caller > nop > #endif > > The previous 3 conditionals exists in arch/mips/kernel/mcount.S. > Originally, ftrace_trace_function == ftrace_stub, so the first > conditional is not taken and we end up executed the ftrace_graph_caller. > All good. > However, later on, ftrace_trace_function is set to 'ftrace_ops_no_ops', > so the first 'bne' is taken and the ftrace_graph_caller is never > executed after that. It is not clear to me if this behaviour is expected > so I used QEMU to get a backtrace when ftrace_trace_function is set to > ftrace_ops_no_ops. Looks like the static tracing code in wrong. The function graph code should be tested every time. -- Steve