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>
This commit is contained in:
committed by
Ingo Molnar
parent
1f0d69a9fc
commit
52f232cb72
@@ -258,6 +258,9 @@ static const char *trace_options[] = {
|
||||
"sched-tree",
|
||||
"ftrace_printk",
|
||||
"ftrace_preempt",
|
||||
#ifdef CONFIG_UNLIKELY_TRACER
|
||||
"unlikely",
|
||||
#endif
|
||||
NULL
|
||||
};
|
||||
|
||||
@@ -1648,6 +1651,18 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)
|
||||
trace_seq_print_cont(s, iter);
|
||||
break;
|
||||
}
|
||||
case TRACE_UNLIKELY: {
|
||||
struct trace_unlikely *field;
|
||||
|
||||
trace_assign_type(field, entry);
|
||||
|
||||
trace_seq_printf(s, "[%s] %s:%s:%d\n",
|
||||
field->correct ? "correct" : "INCORRECT",
|
||||
field->func,
|
||||
field->file,
|
||||
field->line);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
trace_seq_printf(s, "Unknown type %d\n", entry->type);
|
||||
}
|
||||
@@ -1787,6 +1802,18 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
|
||||
return print_return_function(iter);
|
||||
break;
|
||||
}
|
||||
case TRACE_UNLIKELY: {
|
||||
struct trace_unlikely *field;
|
||||
|
||||
trace_assign_type(field, entry);
|
||||
|
||||
trace_seq_printf(s, "[%s] %s:%s:%d\n",
|
||||
field->correct ? "correct" : "INCORRECT",
|
||||
field->func,
|
||||
field->file,
|
||||
field->line);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return TRACE_TYPE_HANDLED;
|
||||
}
|
||||
@@ -2592,6 +2619,7 @@ static int tracing_set_tracer(char *buf)
|
||||
if (t == current_trace)
|
||||
goto out;
|
||||
|
||||
trace_unlikely_disable();
|
||||
if (current_trace && current_trace->reset)
|
||||
current_trace->reset(tr);
|
||||
|
||||
@@ -2599,6 +2627,7 @@ static int tracing_set_tracer(char *buf)
|
||||
if (t->init)
|
||||
t->init(tr);
|
||||
|
||||
trace_unlikely_enable(tr);
|
||||
out:
|
||||
mutex_unlock(&trace_types_lock);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user