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 /include/linux/compiler.h | |
| 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 'include/linux/compiler.h')
| -rw-r--r-- | include/linux/compiler.h | 38 | 
1 files changed, 36 insertions, 2 deletions
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 0628a2013fa..ea7c6be354b 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -63,8 +63,16 @@ struct ftrace_branch_data {  	const char *func;  	const char *file;  	unsigned line; -	unsigned long correct; -	unsigned long incorrect; +	union { +		struct { +			unsigned long correct; +			unsigned long incorrect; +		}; +		struct { +			unsigned long miss; +			unsigned long hit; +		}; +	};  };  /* @@ -103,6 +111,32 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);  # ifndef unlikely  #  define unlikely(x)	(__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 0))  # endif + +#ifdef CONFIG_PROFILE_ALL_BRANCHES +/* + * "Define 'is'", Bill Clinton + * "Define 'if'", Steven Rostedt + */ +#define if(cond) if (__builtin_constant_p((cond)) ? !!(cond) :		\ +	({								\ +		int ______r;						\ +		static struct ftrace_branch_data			\ +			__attribute__((__aligned__(4)))			\ +			__attribute__((section("_ftrace_branch")))	\ +			______f = {					\ +				.func = __func__,			\ +				.file = __FILE__,			\ +				.line = __LINE__,			\ +			};						\ +		______r = !!(cond);					\ +		if (______r)						\ +			______f.hit++;					\ +		else							\ +			______f.miss++;					\ +		______r;						\ +	})) +#endif /* CONFIG_PROFILE_ALL_BRANCHES */ +  #else  # define likely(x)	__builtin_expect(!!(x), 1)  # define unlikely(x)	__builtin_expect(!!(x), 0)  |