diff options
| author | Steven Rostedt <srostedt@redhat.com> | 2008-11-21 01:30:54 -0500 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-11-23 11:41:01 +0100 | 
| commit | 2bcd521a684cc94befbe2ce7d5b613c841b0d304 (patch) | |
| tree | 63bc4dbc52defa27c8cac9e46dddadfcb36c1c7a /kernel/trace/trace_branch.c | |
| parent | bac28bfe42ba98ee67503f78984d1d5e1ebbbb78 (diff) | |
| download | olio-linux-3.10-2bcd521a684cc94befbe2ce7d5b613c841b0d304.tar.xz olio-linux-3.10-2bcd521a684cc94befbe2ce7d5b613c841b0d304.zip  | |
trace: profile all if conditionals
Impact: feature to profile if statements
This patch adds a branch profiler for all if () statements.
The results will be found in:
  /debugfs/tracing/profile_branch
For example:
   miss      hit    %        Function                  File              Line
 ------- ---------  -        --------                  ----              ----
       0        1 100 x86_64_start_reservations      head64.c             127
       0        1 100 copy_bootdata                  head64.c             69
       1        0   0 x86_64_start_kernel            head64.c             111
      32        0   0 set_intr_gate                  desc.h               319
       1        0   0 reserve_ebda_region            head.c               51
       1        0   0 reserve_ebda_region            head.c               47
       0        1 100 reserve_ebda_region            head.c               42
       0        0   X maxcpus                        main.c               165
Miss means the branch was not taken. Hit means the branch was taken.
The percent is the percentage the branch was taken.
This adds a significant amount of overhead and should only be used
by those analyzing their system.
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/trace/trace_branch.c')
| -rw-r--r-- | kernel/trace/trace_branch.c | 33 | 
1 files changed, 31 insertions, 2 deletions
diff --git a/kernel/trace/trace_branch.c b/kernel/trace/trace_branch.c index 142acb3b4e0..85792aec64d 100644 --- a/kernel/trace/trace_branch.c +++ b/kernel/trace/trace_branch.c @@ -185,6 +185,7 @@ EXPORT_SYMBOL(ftrace_likely_update);  struct ftrace_pointer {  	void		*start;  	void		*stop; +	int		hit;  };  static void * @@ -223,13 +224,17 @@ static void t_stop(struct seq_file *m, void *p)  static int t_show(struct seq_file *m, void *v)  { +	struct ftrace_pointer *fp = m->private;  	struct ftrace_branch_data *p = v;  	const char *f;  	long percent;  	if (v == (void *)1) { -		seq_printf(m, " correct incorrect  %% " -			      "       Function                " +		if (fp->hit) +			seq_printf(m, "   miss      hit    %% "); +		else +			seq_printf(m, " correct incorrect  %% "); +		seq_printf(m, "       Function                "  			      "  File              Line\n"  			      " ------- ---------  - "  			      "       --------                " @@ -243,6 +248,9 @@ static int t_show(struct seq_file *m, void *v)  		f--;  	f++; +	/* +	 * The miss is overlayed on correct, and hit on incorrect. +	 */  	if (p->correct) {  		percent = p->incorrect * 100;  		percent /= p->correct + p->incorrect; @@ -284,6 +292,18 @@ static const struct file_operations tracing_branch_fops = {  	.llseek		= seq_lseek,  }; +#ifdef CONFIG_PROFILE_ALL_BRANCHES +extern unsigned long __start_branch_profile[]; +extern unsigned long __stop_branch_profile[]; + +static struct ftrace_pointer ftrace_branch_pos = { +	.start			= __start_branch_profile, +	.stop			= __stop_branch_profile, +	.hit			= 1, +}; + +#endif /* CONFIG_PROFILE_ALL_BRANCHES */ +  extern unsigned long __start_annotated_branch_profile[];  extern unsigned long __stop_annotated_branch_profile[]; @@ -306,6 +326,15 @@ static __init int ftrace_branch_init(void)  		pr_warning("Could not create debugfs "  			   "'profile_annotatet_branch' entry\n"); +#ifdef CONFIG_PROFILE_ALL_BRANCHES +	entry = debugfs_create_file("profile_branch", 0444, d_tracer, +				    &ftrace_branch_pos, +				    &tracing_branch_fops); +	if (!entry) +		pr_warning("Could not create debugfs" +			   " 'profile_branch' entry\n"); +#endif +  	return 0;  }  |