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.c | |
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.c')
-rw-r--r-- | kernel/trace/trace.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index a3f7ae9cd8e1..83d38634bc90 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -258,6 +258,9 @@ static const char *trace_options[] = { | |||
258 | "sched-tree", | 258 | "sched-tree", |
259 | "ftrace_printk", | 259 | "ftrace_printk", |
260 | "ftrace_preempt", | 260 | "ftrace_preempt", |
261 | #ifdef CONFIG_UNLIKELY_TRACER | ||
262 | "unlikely", | ||
263 | #endif | ||
261 | NULL | 264 | NULL |
262 | }; | 265 | }; |
263 | 266 | ||
@@ -1648,6 +1651,18 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu) | |||
1648 | trace_seq_print_cont(s, iter); | 1651 | trace_seq_print_cont(s, iter); |
1649 | break; | 1652 | break; |
1650 | } | 1653 | } |
1654 | case TRACE_UNLIKELY: { | ||
1655 | struct trace_unlikely *field; | ||
1656 | |||
1657 | trace_assign_type(field, entry); | ||
1658 | |||
1659 | trace_seq_printf(s, "[%s] %s:%s:%d\n", | ||
1660 | field->correct ? "correct" : "INCORRECT", | ||
1661 | field->func, | ||
1662 | field->file, | ||
1663 | field->line); | ||
1664 | break; | ||
1665 | } | ||
1651 | default: | 1666 | default: |
1652 | trace_seq_printf(s, "Unknown type %d\n", entry->type); | 1667 | trace_seq_printf(s, "Unknown type %d\n", entry->type); |
1653 | } | 1668 | } |
@@ -1787,6 +1802,18 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter) | |||
1787 | return print_return_function(iter); | 1802 | return print_return_function(iter); |
1788 | break; | 1803 | break; |
1789 | } | 1804 | } |
1805 | case TRACE_UNLIKELY: { | ||
1806 | struct trace_unlikely *field; | ||
1807 | |||
1808 | trace_assign_type(field, entry); | ||
1809 | |||
1810 | trace_seq_printf(s, "[%s] %s:%s:%d\n", | ||
1811 | field->correct ? "correct" : "INCORRECT", | ||
1812 | field->func, | ||
1813 | field->file, | ||
1814 | field->line); | ||
1815 | break; | ||
1816 | } | ||
1790 | } | 1817 | } |
1791 | return TRACE_TYPE_HANDLED; | 1818 | return TRACE_TYPE_HANDLED; |
1792 | } | 1819 | } |
@@ -2592,6 +2619,7 @@ static int tracing_set_tracer(char *buf) | |||
2592 | if (t == current_trace) | 2619 | if (t == current_trace) |
2593 | goto out; | 2620 | goto out; |
2594 | 2621 | ||
2622 | trace_unlikely_disable(); | ||
2595 | if (current_trace && current_trace->reset) | 2623 | if (current_trace && current_trace->reset) |
2596 | current_trace->reset(tr); | 2624 | current_trace->reset(tr); |
2597 | 2625 | ||
@@ -2599,6 +2627,7 @@ static int tracing_set_tracer(char *buf) | |||
2599 | if (t->init) | 2627 | if (t->init) |
2600 | t->init(tr); | 2628 | t->init(tr); |
2601 | 2629 | ||
2630 | trace_unlikely_enable(tr); | ||
2602 | out: | 2631 | out: |
2603 | mutex_unlock(&trace_types_lock); | 2632 | mutex_unlock(&trace_types_lock); |
2604 | 2633 | ||