diff options
| author | Tim Bird <tim.bird@am.sony.com> | 2010-02-25 15:36:43 -0800 | 
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2010-03-05 21:20:57 -0500 | 
| commit | 0e95017355dcf43031da6d0e360a748717e56df1 (patch) | |
| tree | 829989bfb494e8d2d773d9dc1bc014b7f28d3bed /kernel/trace/trace_functions_graph.c | |
| parent | 1acaa1b2d9b5904c9cce06122990a2d71046ce16 (diff) | |
| download | olio-linux-3.10-0e95017355dcf43031da6d0e360a748717e56df1.tar.xz olio-linux-3.10-0e95017355dcf43031da6d0e360a748717e56df1.zip  | |
function-graph: Add tracing_thresh support to function_graph tracer
Add support for tracing_thresh to the function_graph tracer.  This
version of this feature isolates the checks into new entry and
return functions, to avoid adding more conditional code into the
main function_graph paths.
When the tracing_thresh is set and the function graph tracer is
enabled, only the functions that took longer than the time in
microseconds that was set in tracing_thresh are recorded. To do this
efficiently, only the function exits are recorded:
 [tracing]# echo 100 > tracing_thresh
 [tracing]# echo function_graph > current_tracer
 [tracing]# cat trace
 # tracer: function_graph
 #
 # CPU  DURATION                  FUNCTION CALLS
 # |     |   |                     |   |   |   |
  1) ! 119.214 us  |  } /* smp_apic_timer_interrupt */
  1)   <========== |
  0) ! 101.527 us  |              } /* __rcu_process_callbacks */
  0) ! 126.461 us  |            } /* rcu_process_callbacks */
  0) ! 145.111 us  |          } /* __do_softirq */
  0) ! 149.667 us  |        } /* do_softirq */
  0) ! 168.817 us  |      } /* irq_exit */
  0) ! 248.254 us  |    } /* smp_apic_timer_interrupt */
Also, add support for specifying tracing_thresh on the kernel
command line.  When used like so: "tracing_thresh=200 ftrace=function_graph"
this can be used to analyse system startup.  It is important to disable
tracing soon after boot, in order to avoid losing the trace data.
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Tim Bird <tim.bird@am.sony.com>
LKML-Reference: <4B87098B.4040308@am.sony.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace/trace_functions_graph.c')
| -rw-r--r-- | kernel/trace/trace_functions_graph.c | 25 | 
1 files changed, 23 insertions, 2 deletions
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c index 7b1f24618d9..e9df04b6026 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c @@ -237,6 +237,14 @@ int trace_graph_entry(struct ftrace_graph_ent *trace)  	return ret;  } +int trace_graph_thresh_entry(struct ftrace_graph_ent *trace) +{ +	if (tracing_thresh) +		return 1; +	else +		return trace_graph_entry(trace); +} +  static void __trace_graph_return(struct trace_array *tr,  				struct ftrace_graph_ret *trace,  				unsigned long flags, @@ -290,13 +298,26 @@ void set_graph_array(struct trace_array *tr)  	smp_mb();  } +void trace_graph_thresh_return(struct ftrace_graph_ret *trace) +{ +	if (tracing_thresh && +	    (trace->rettime - trace->calltime < tracing_thresh)) +		return; +	else +		trace_graph_return(trace); +} +  static int graph_trace_init(struct trace_array *tr)  {  	int ret;  	set_graph_array(tr); -	ret = register_ftrace_graph(&trace_graph_return, -				    &trace_graph_entry); +	if (tracing_thresh) +		ret = register_ftrace_graph(&trace_graph_thresh_return, +					    &trace_graph_thresh_entry); +	else +		ret = register_ftrace_graph(&trace_graph_return, +					    &trace_graph_entry);  	if (ret)  		return ret;  	tracing_start_cmdline_record();  |