x86, hw-branch-tracer: add selftest
Add a selftest for the hw-branch-tracer. Signed-off-by: Markus Metzger <markus.t.metzger@intel.com> LKML-Reference: <20090313105027.A30183@sedona.ch.intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
ba9372a8f3
commit
321bb5e1ac
@ -576,6 +576,8 @@ 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,
|
extern int trace_selftest_startup_branch(struct tracer *trace,
|
||||||
struct trace_array *tr);
|
struct trace_array *tr);
|
||||||
|
extern int trace_selftest_startup_hw_branches(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);
|
||||||
|
@ -342,7 +342,10 @@ struct tracer bts_tracer __read_mostly =
|
|||||||
.start = bts_trace_start,
|
.start = bts_trace_start,
|
||||||
.stop = bts_trace_stop,
|
.stop = bts_trace_stop,
|
||||||
.open = trace_bts_prepare,
|
.open = trace_bts_prepare,
|
||||||
.close = trace_bts_close
|
.close = trace_bts_close,
|
||||||
|
#ifdef CONFIG_FTRACE_SELFTEST
|
||||||
|
.selftest = trace_selftest_startup_hw_branches,
|
||||||
|
#endif /* CONFIG_FTRACE_SELFTEST */
|
||||||
};
|
};
|
||||||
|
|
||||||
__init static int init_bts_trace(void)
|
__init static int init_bts_trace(void)
|
||||||
|
@ -16,6 +16,7 @@ static inline int trace_valid_entry(struct trace_entry *entry)
|
|||||||
case TRACE_BRANCH:
|
case TRACE_BRANCH:
|
||||||
case TRACE_GRAPH_ENT:
|
case TRACE_GRAPH_ENT:
|
||||||
case TRACE_GRAPH_RET:
|
case TRACE_GRAPH_RET:
|
||||||
|
case TRACE_HW_BRANCHES:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -691,3 +692,55 @@ trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_BRANCH_TRACER */
|
#endif /* CONFIG_BRANCH_TRACER */
|
||||||
|
|
||||||
|
#ifdef CONFIG_HW_BRANCH_TRACER
|
||||||
|
int
|
||||||
|
trace_selftest_startup_hw_branches(struct tracer *trace,
|
||||||
|
struct trace_array *tr)
|
||||||
|
{
|
||||||
|
unsigned long count;
|
||||||
|
int ret;
|
||||||
|
struct trace_iterator iter;
|
||||||
|
struct tracer tracer;
|
||||||
|
|
||||||
|
if (!trace->open) {
|
||||||
|
printk(KERN_CONT "missing open function...");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = tracer_init(trace, tr);
|
||||||
|
if (ret) {
|
||||||
|
warn_failed_init_tracer(trace, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The hw-branch tracer needs to collect the trace from the various
|
||||||
|
* cpu trace buffers - before tracing is stopped.
|
||||||
|
*/
|
||||||
|
memset(&iter, 0, sizeof(iter));
|
||||||
|
memcpy(&tracer, trace, sizeof(tracer));
|
||||||
|
|
||||||
|
iter.trace = &tracer;
|
||||||
|
iter.tr = tr;
|
||||||
|
iter.pos = -1;
|
||||||
|
mutex_init(&iter.mutex);
|
||||||
|
|
||||||
|
trace->open(&iter);
|
||||||
|
|
||||||
|
mutex_destroy(&iter.mutex);
|
||||||
|
|
||||||
|
tracing_stop();
|
||||||
|
|
||||||
|
ret = trace_test_buffer(tr, &count);
|
||||||
|
trace->reset(tr);
|
||||||
|
tracing_start();
|
||||||
|
|
||||||
|
if (!ret && !count) {
|
||||||
|
printk(KERN_CONT "no entries found..");
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_HW_BRANCH_TRACER */
|
||||||
|
Loading…
Reference in New Issue
Block a user