Loading kernel/trace/trace.h +2 −0 Original line number Diff line number Diff line Loading @@ -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); Loading kernel/trace/trace_hw_branches.c +4 −1 Original line number Diff line number Diff line Loading @@ -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) Loading kernel/trace/trace_selftest.c +53 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */ Loading
kernel/trace/trace.h +2 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
kernel/trace/trace_hw_branches.c +4 −1 Original line number Diff line number Diff line Loading @@ -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) Loading
kernel/trace/trace_selftest.c +53 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */