aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_branch.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/trace_branch.c')
-rw-r--r--kernel/trace/trace_branch.c108
1 files changed, 60 insertions, 48 deletions
diff --git a/kernel/trace/trace_branch.c b/kernel/trace/trace_branch.c
index da5cf3e5581b..ca017e0a9a27 100644
--- a/kernel/trace/trace_branch.c
+++ b/kernel/trace/trace_branch.c
@@ -16,12 +16,12 @@
16#include <asm/local.h> 16#include <asm/local.h>
17 17
18#include "trace.h" 18#include "trace.h"
19#include "trace_stat.h"
19#include "trace_output.h" 20#include "trace_output.h"
20 21
21static struct tracer branch_trace;
22
23#ifdef CONFIG_BRANCH_TRACER 22#ifdef CONFIG_BRANCH_TRACER
24 23
24static struct tracer branch_trace;
25static int branch_tracing_enabled __read_mostly; 25static int branch_tracing_enabled __read_mostly;
26static DEFINE_MUTEX(branch_tracing_mutex); 26static DEFINE_MUTEX(branch_tracing_mutex);
27 27
@@ -191,6 +191,30 @@ static struct trace_event trace_branch_event = {
191 .binary = trace_nop_print, 191 .binary = trace_nop_print,
192}; 192};
193 193
194static struct tracer branch_trace __read_mostly =
195{
196 .name = "branch",
197 .init = branch_trace_init,
198 .reset = branch_trace_reset,
199#ifdef CONFIG_FTRACE_SELFTEST
200 .selftest = trace_selftest_startup_branch,
201#endif /* CONFIG_FTRACE_SELFTEST */
202};
203
204__init static int init_branch_tracer(void)
205{
206 int ret;
207
208 ret = register_ftrace_event(&trace_branch_event);
209 if (!ret) {
210 printk(KERN_WARNING "Warning: could not register "
211 "branch events\n");
212 return 1;
213 }
214 return register_tracer(&branch_trace);
215}
216device_initcall(init_branch_tracer);
217
194#else 218#else
195static inline 219static inline
196void trace_likely_condition(struct ftrace_branch_data *f, int val, int expect) 220void trace_likely_condition(struct ftrace_branch_data *f, int val, int expect)
@@ -305,6 +329,29 @@ static int annotated_branch_stat_cmp(void *p1, void *p2)
305 return 0; 329 return 0;
306} 330}
307 331
332static struct tracer_stat annotated_branch_stats = {
333 .name = "branch_annotated",
334 .stat_start = annotated_branch_stat_start,
335 .stat_next = annotated_branch_stat_next,
336 .stat_cmp = annotated_branch_stat_cmp,
337 .stat_headers = annotated_branch_stat_headers,
338 .stat_show = branch_stat_show
339};
340
341__init static int init_annotated_branch_stats(void)
342{
343 int ret;
344
345 ret = register_stat_tracer(&annotated_branch_stats);
346 if (!ret) {
347 printk(KERN_WARNING "Warning: could not register "
348 "annotated branches stats\n");
349 return 1;
350 }
351 return 0;
352}
353fs_initcall(init_annotated_branch_stats);
354
308#ifdef CONFIG_PROFILE_ALL_BRANCHES 355#ifdef CONFIG_PROFILE_ALL_BRANCHES
309 356
310extern unsigned long __start_branch_profile[]; 357extern unsigned long __start_branch_profile[];
@@ -339,60 +386,25 @@ all_branch_stat_next(void *v, int idx)
339 return p; 386 return p;
340} 387}
341 388
342static struct tracer_stat branch_stats[] = { 389static struct tracer_stat all_branch_stats = {
343 {.name = "annotated", 390 .name = "branch_all",
344 .stat_start = annotated_branch_stat_start,
345 .stat_next = annotated_branch_stat_next,
346 .stat_cmp = annotated_branch_stat_cmp,
347 .stat_headers = annotated_branch_stat_headers,
348 .stat_show = branch_stat_show},
349
350 {.name = "all",
351 .stat_start = all_branch_stat_start, 391 .stat_start = all_branch_stat_start,
352 .stat_next = all_branch_stat_next, 392 .stat_next = all_branch_stat_next,
353 .stat_headers = all_branch_stat_headers, 393 .stat_headers = all_branch_stat_headers,
354 .stat_show = branch_stat_show}, 394 .stat_show = branch_stat_show
355
356 { }
357};
358#else
359static struct tracer_stat branch_stats[] = {
360 {.name = "annotated",
361 .stat_start = annotated_branch_stat_start,
362 .stat_next = annotated_branch_stat_next,
363 .stat_cmp = annotated_branch_stat_cmp,
364 .stat_headers = annotated_branch_stat_headers,
365 .stat_show = branch_stat_show},
366
367 { }
368}; 395};
369#endif /* CONFIG_PROFILE_ALL_BRANCHES */
370 396
371 397__init static int all_annotated_branch_stats(void)
372static struct tracer branch_trace __read_mostly =
373{ 398{
374 .name = "branch",
375#ifdef CONFIG_BRANCH_TRACER
376 .init = branch_trace_init,
377 .reset = branch_trace_reset,
378#ifdef CONFIG_FTRACE_SELFTEST
379 .selftest = trace_selftest_startup_branch,
380#endif /* CONFIG_FTRACE_SELFTEST */
381#endif
382 .stats = branch_stats
383};
384
385__init static int init_branch_trace(void)
386{
387#ifdef CONFIG_BRANCH_TRACER
388 int ret; 399 int ret;
389 ret = register_ftrace_event(&trace_branch_event); 400
401 ret = register_stat_tracer(&all_branch_stats);
390 if (!ret) { 402 if (!ret) {
391 printk(KERN_WARNING "Warning: could not register branch events\n"); 403 printk(KERN_WARNING "Warning: could not register "
404 "all branches stats\n");
392 return 1; 405 return 1;
393 } 406 }
394#endif 407 return 0;
395
396 return register_tracer(&branch_trace);
397} 408}
398device_initcall(init_branch_trace); 409fs_initcall(all_annotated_branch_stats);
410#endif /* CONFIG_PROFILE_ALL_BRANCHES */