diff options
| author | Frederic Weisbecker <fweisbec@gmail.com> | 2009-02-07 21:33:57 +0100 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-02-09 10:51:37 +0100 | 
| commit | 7447dce96f2233d250bc39a4a10a42f7c3dd46fc (patch) | |
| tree | c02c991cca658e69a0c83c1a93b068df1d5caa53 /kernel | |
| parent | 2db270a80b8f2238e536876cfb3987af02684df8 (diff) | |
| download | olio-linux-3.10-7447dce96f2233d250bc39a4a10a42f7c3dd46fc.tar.xz olio-linux-3.10-7447dce96f2233d250bc39a4a10a42f7c3dd46fc.zip  | |
tracing/function-graph-tracer: provide a selftest for the function graph tracer
Making it more easy to do a basic regression test for this tracer.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/trace/trace.h | 2 | ||||
| -rw-r--r-- | kernel/trace/trace_functions_graph.c | 3 | ||||
| -rw-r--r-- | kernel/trace/trace_selftest.c | 50 | 
3 files changed, 55 insertions, 0 deletions
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index b9838f4a692..a011ec06222 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -500,6 +500,8 @@ extern int DYN_FTRACE_TEST_NAME(void);  #ifdef CONFIG_FTRACE_STARTUP_TEST  extern int trace_selftest_startup_function(struct tracer *trace,  					   struct trace_array *tr); +extern int trace_selftest_startup_function_graph(struct tracer *trace, +						 struct trace_array *tr);  extern int trace_selftest_startup_irqsoff(struct tracer *trace,  					  struct trace_array *tr);  extern int trace_selftest_startup_preemptoff(struct tracer *trace, diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c index 222f97d336a..88f8d9d80a9 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c @@ -750,6 +750,9 @@ static struct tracer graph_trace __read_mostly = {  	.print_line	= print_graph_function,  	.print_header	= print_graph_headers,  	.flags		= &tracer_flags, +#ifdef CONFIG_FTRACE_SELFTEST +	.selftest	= trace_selftest_startup_function_graph, +#endif  };  static __init int init_graph_trace(void) diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c index 445700e51f6..0c9aa1457e5 100644 --- a/kernel/trace/trace_selftest.c +++ b/kernel/trace/trace_selftest.c @@ -13,6 +13,8 @@ static inline int trace_valid_entry(struct trace_entry *entry)  	case TRACE_PRINT:  	case TRACE_SPECIAL:  	case TRACE_BRANCH: +	case TRACE_GRAPH_ENT: +	case TRACE_GRAPH_RET:  		return 1;  	}  	return 0; @@ -227,6 +229,54 @@ trace_selftest_startup_function(struct tracer *trace, struct trace_array *tr)  }  #endif /* CONFIG_FUNCTION_TRACER */ + +#ifdef CONFIG_FUNCTION_GRAPH_TRACER +/* + * Pretty much the same than for the function tracer from which the selftest + * has been borrowed. + */ +int +trace_selftest_startup_function_graph(struct tracer *trace, +					struct trace_array *tr) +{ +	int ret; +	unsigned long count; + +	ret = tracer_init(trace, tr); +	if (ret) { +		warn_failed_init_tracer(trace, ret); +		goto out; +	} + +	/* Sleep for a 1/10 of a second */ +	msleep(100); + +	tracing_stop(); + +	/* check the trace buffer */ +	ret = trace_test_buffer(tr, &count); + +	trace->reset(tr); +	tracing_start(); + +	if (!ret && !count) { +		printk(KERN_CONT ".. no entries found .."); +		ret = -1; +		goto out; +	} + +	/* Don't test dynamic tracing, the function tracer already did */ + +out: +	/* Stop it if we failed */ +	if (ret) +		ftrace_graph_stop(); + +	return ret; +} +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */ + +  #ifdef CONFIG_IRQSOFF_TRACER  int  trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr)  |