aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace.h
diff options
context:
space:
mode:
authorSteven Rostedt <rostedt@goodmis.org>2008-11-12 00:14:40 -0500
committerIngo Molnar <mingo@elte.hu>2008-11-12 05:52:02 -0500
commit52f232cb720a7babb752849cbc2cab2d24021209 (patch)
tree47c7e800549457bd5ab9b54f47729acac6e10780 /kernel/trace/trace.h
parent1f0d69a9fc815db82f15722bf05227190b1d714d (diff)
tracing: likely/unlikely branch annotation tracer
Impact: new likely/unlikely branch tracer This patch adds a way to record the instances of the likely() and unlikely() branch condition annotations. When "unlikely" is set in /debugfs/tracing/iter_ctrl the unlikely conditions will be added to any of the ftrace tracers. The change takes effect when a new tracer is passed into the current_tracer file. For example: bash-3471 [003] 357.014755: [INCORRECT] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [correct] calc_delta_fair:sched_fair.c:411 bash-3471 [003] 357.014759: [correct] account_group_exec_runtime:sched_stats.h:356 bash-3471 [003] 357.014761: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014763: [INCORRECT] calc_delta_fair:sched_fair.c:411 bash-3471 [003] 357.014765: [correct] calc_delta_mine:sched.c:1279 Which shows the normal tracer heading, as well as whether the condition was correct "[correct]" or was mistaken "[INCORRECT]", followed by the function, file name and line number. Signed-off-by: Steven Rostedt <srostedt@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/trace/trace.h')
-rw-r--r--kernel/trace/trace.h39
1 files changed, 39 insertions, 0 deletions
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index b5f91f198fd4..9635aa2c4fc1 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -22,6 +22,7 @@ enum trace_type {
22 TRACE_SPECIAL, 22 TRACE_SPECIAL,
23 TRACE_MMIO_RW, 23 TRACE_MMIO_RW,
24 TRACE_MMIO_MAP, 24 TRACE_MMIO_MAP,
25 TRACE_UNLIKELY,
25 TRACE_BOOT_CALL, 26 TRACE_BOOT_CALL,
26 TRACE_BOOT_RET, 27 TRACE_BOOT_RET,
27 TRACE_FN_RET, 28 TRACE_FN_RET,
@@ -134,6 +135,16 @@ struct trace_boot_ret {
134 struct boot_trace_ret boot_ret; 135 struct boot_trace_ret boot_ret;
135}; 136};
136 137
138#define TRACE_FUNC_SIZE 30
139#define TRACE_FILE_SIZE 20
140struct trace_unlikely {
141 struct trace_entry ent;
142 unsigned line;
143 char func[TRACE_FUNC_SIZE+1];
144 char file[TRACE_FILE_SIZE+1];
145 char correct;
146};
147
137/* 148/*
138 * trace_flag_type is an enumeration that holds different 149 * trace_flag_type is an enumeration that holds different
139 * states when a trace occurs. These are: 150 * states when a trace occurs. These are:
@@ -236,6 +247,7 @@ extern void __ftrace_bad_type(void);
236 TRACE_MMIO_MAP); \ 247 TRACE_MMIO_MAP); \
237 IF_ASSIGN(var, ent, struct trace_boot_call, TRACE_BOOT_CALL);\ 248 IF_ASSIGN(var, ent, struct trace_boot_call, TRACE_BOOT_CALL);\
238 IF_ASSIGN(var, ent, struct trace_boot_ret, TRACE_BOOT_RET);\ 249 IF_ASSIGN(var, ent, struct trace_boot_ret, TRACE_BOOT_RET);\
250 IF_ASSIGN(var, ent, struct trace_unlikely, TRACE_UNLIKELY); \
239 IF_ASSIGN(var, ent, struct ftrace_ret_entry, TRACE_FN_RET);\ 251 IF_ASSIGN(var, ent, struct ftrace_ret_entry, TRACE_FN_RET);\
240 __ftrace_bad_type(); \ 252 __ftrace_bad_type(); \
241 } while (0) 253 } while (0)
@@ -456,6 +468,9 @@ enum trace_iterator_flags {
456 TRACE_ITER_SCHED_TREE = 0x200, 468 TRACE_ITER_SCHED_TREE = 0x200,
457 TRACE_ITER_PRINTK = 0x400, 469 TRACE_ITER_PRINTK = 0x400,
458 TRACE_ITER_PREEMPTONLY = 0x800, 470 TRACE_ITER_PREEMPTONLY = 0x800,
471#ifdef CONFIG_UNLIKELY_TRACER
472 TRACE_ITER_UNLIKELY = 0x1000,
473#endif
459}; 474};
460 475
461/* 476/*
@@ -515,4 +530,28 @@ static inline void ftrace_preempt_enable(int resched)
515 preempt_enable_notrace(); 530 preempt_enable_notrace();
516} 531}
517 532
533#ifdef CONFIG_UNLIKELY_TRACER
534extern int enable_unlikely_tracing(struct trace_array *tr);
535extern void disable_unlikely_tracing(void);
536static inline int trace_unlikely_enable(struct trace_array *tr)
537{
538 if (trace_flags & TRACE_ITER_UNLIKELY)
539 return enable_unlikely_tracing(tr);
540 return 0;
541}
542static inline void trace_unlikely_disable(void)
543{
544 /* due to races, always disable */
545 disable_unlikely_tracing();
546}
547#else
548static inline int trace_unlikely_enable(struct trace_array *tr)
549{
550 return 0;
551}
552static inline void trace_unlikely_disable(void)
553{
554}
555#endif /* CONFIG_UNLIKELY_TRACER */
556
518#endif /* _LINUX_KERNEL_TRACE_H */ 557#endif /* _LINUX_KERNEL_TRACE_H */