Skip to content

Commit

Permalink
x86, hw-branch-tracer: add selftest
Browse files Browse the repository at this point in the history
Add a selftest for the hw-branch-tracer.

Signed-off-by: Markus Metzger <[email protected]>
LKML-Reference: <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
  • Loading branch information
markus-metzger authored and Ingo Molnar committed Mar 13, 2009
1 parent ba9372a commit 321bb5e
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 1 deletion.
2 changes: 2 additions & 0 deletions kernel/trace/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,8 @@ extern int trace_selftest_startup_sysprof(struct tracer *trace,
struct trace_array *tr);
extern int trace_selftest_startup_branch(struct tracer *trace,
struct trace_array *tr);
extern int trace_selftest_startup_hw_branches(struct tracer *trace,
struct trace_array *tr);
#endif /* CONFIG_FTRACE_STARTUP_TEST */

extern void *head_page(struct trace_array_cpu *data);
Expand Down
5 changes: 4 additions & 1 deletion kernel/trace/trace_hw_branches.c
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,10 @@ struct tracer bts_tracer __read_mostly =
.start = bts_trace_start,
.stop = bts_trace_stop,
.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)
Expand Down
53 changes: 53 additions & 0 deletions kernel/trace/trace_selftest.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ static inline int trace_valid_entry(struct trace_entry *entry)
case TRACE_BRANCH:
case TRACE_GRAPH_ENT:
case TRACE_GRAPH_RET:
case TRACE_HW_BRANCHES:
return 1;
}
return 0;
Expand Down Expand Up @@ -691,3 +692,55 @@ trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr)
return ret;
}
#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 */

0 comments on commit 321bb5e

Please sign in to comment.