ftrace: add tracer called branch
Impact: added new branch tracer Currently the tracing of branch profiling (unlikelys and likelys hit) is only activated by the iter_ctrl. This patch adds a tracer called "branch" that will just trace the branch profiling. The advantage of adding this tracer is that it can be added to the ftrace selftests on startup. Signed-off-by: Steven Rostedt <srostedt@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
9f029e83e9
commit
80e5ea4506
|
@ -420,6 +420,8 @@ extern int trace_selftest_startup_sched_switch(struct tracer *trace,
|
||||||
struct trace_array *tr);
|
struct trace_array *tr);
|
||||||
extern int trace_selftest_startup_sysprof(struct tracer *trace,
|
extern int trace_selftest_startup_sysprof(struct tracer *trace,
|
||||||
struct trace_array *tr);
|
struct trace_array *tr);
|
||||||
|
extern int trace_selftest_startup_branch(struct tracer *trace,
|
||||||
|
struct trace_array *tr);
|
||||||
#endif /* CONFIG_FTRACE_STARTUP_TEST */
|
#endif /* CONFIG_FTRACE_STARTUP_TEST */
|
||||||
|
|
||||||
extern void *head_page(struct trace_array_cpu *data);
|
extern void *head_page(struct trace_array_cpu *data);
|
||||||
|
|
|
@ -13,6 +13,7 @@ static inline int trace_valid_entry(struct trace_entry *entry)
|
||||||
case TRACE_STACK:
|
case TRACE_STACK:
|
||||||
case TRACE_PRINT:
|
case TRACE_PRINT:
|
||||||
case TRACE_SPECIAL:
|
case TRACE_SPECIAL:
|
||||||
|
case TRACE_BRANCH:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -544,3 +545,25 @@ trace_selftest_startup_sysprof(struct tracer *trace, struct trace_array *tr)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_SYSPROF_TRACER */
|
#endif /* CONFIG_SYSPROF_TRACER */
|
||||||
|
|
||||||
|
#ifdef CONFIG_BRANCH_TRACER
|
||||||
|
int
|
||||||
|
trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr)
|
||||||
|
{
|
||||||
|
unsigned long count;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* start the tracing */
|
||||||
|
trace->init(tr);
|
||||||
|
/* Sleep for a 1/10 of a second */
|
||||||
|
msleep(100);
|
||||||
|
/* stop the tracing. */
|
||||||
|
tracing_stop();
|
||||||
|
/* check the trace buffer */
|
||||||
|
ret = trace_test_buffer(tr, &count);
|
||||||
|
trace->reset(tr);
|
||||||
|
tracing_start();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_BRANCH_TRACER */
|
||||||
|
|
|
@ -114,6 +114,48 @@ void disable_branch_tracing(void)
|
||||||
out_unlock:
|
out_unlock:
|
||||||
mutex_unlock(&branch_tracing_mutex);
|
mutex_unlock(&branch_tracing_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void start_branch_trace(struct trace_array *tr)
|
||||||
|
{
|
||||||
|
enable_branch_tracing(tr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void stop_branch_trace(struct trace_array *tr)
|
||||||
|
{
|
||||||
|
disable_branch_tracing();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void branch_trace_init(struct trace_array *tr)
|
||||||
|
{
|
||||||
|
int cpu;
|
||||||
|
|
||||||
|
for_each_online_cpu(cpu)
|
||||||
|
tracing_reset(tr, cpu);
|
||||||
|
|
||||||
|
start_branch_trace(tr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void branch_trace_reset(struct trace_array *tr)
|
||||||
|
{
|
||||||
|
stop_branch_trace(tr);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct tracer branch_trace __read_mostly =
|
||||||
|
{
|
||||||
|
.name = "branch",
|
||||||
|
.init = branch_trace_init,
|
||||||
|
.reset = branch_trace_reset,
|
||||||
|
#ifdef CONFIG_FTRACE_SELFTEST
|
||||||
|
.selftest = trace_selftest_startup_branch,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
__init static int init_branch_trace(void)
|
||||||
|
{
|
||||||
|
return register_tracer(&branch_trace);
|
||||||
|
}
|
||||||
|
|
||||||
|
device_initcall(init_branch_trace);
|
||||||
#else
|
#else
|
||||||
static inline
|
static inline
|
||||||
void trace_likely_condition(struct ftrace_branch_data *f, int val, int expect)
|
void trace_likely_condition(struct ftrace_branch_data *f, int val, int expect)
|
||||||
|
|
Loading…
Reference in New Issue