diff options
author | Steven Rostedt <rostedt@goodmis.org> | 2008-11-12 00:14:40 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-11-12 05:52:02 -0500 |
commit | 52f232cb720a7babb752849cbc2cab2d24021209 (patch) | |
tree | 47c7e800549457bd5ab9b54f47729acac6e10780 /kernel/trace/trace.h | |
parent | 1f0d69a9fc815db82f15722bf05227190b1d714d (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.h | 39 |
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 | ||
140 | struct 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 | ||
534 | extern int enable_unlikely_tracing(struct trace_array *tr); | ||
535 | extern void disable_unlikely_tracing(void); | ||
536 | static 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 | } | ||
542 | static inline void trace_unlikely_disable(void) | ||
543 | { | ||
544 | /* due to races, always disable */ | ||
545 | disable_unlikely_tracing(); | ||
546 | } | ||
547 | #else | ||
548 | static inline int trace_unlikely_enable(struct trace_array *tr) | ||
549 | { | ||
550 | return 0; | ||
551 | } | ||
552 | static 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 */ |