diff options
Diffstat (limited to 'kernel/trace/trace_selftest.c')
| -rw-r--r-- | kernel/trace/trace_selftest.c | 53 | 
1 files changed, 53 insertions, 0 deletions
diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c index 00dd6485bdd..71f2edb0fd8 100644 --- a/kernel/trace/trace_selftest.c +++ b/kernel/trace/trace_selftest.c @@ -17,6 +17,7 @@ static inline int trace_valid_entry(struct trace_entry *entry)  	case TRACE_GRAPH_ENT:  	case TRACE_GRAPH_RET:  	case TRACE_HW_BRANCHES: +	case TRACE_KSYM:  		return 1;  	}  	return 0; @@ -807,3 +808,55 @@ trace_selftest_startup_hw_branches(struct tracer *trace,  	return ret;  }  #endif /* CONFIG_HW_BRANCH_TRACER */ + +#ifdef CONFIG_KSYM_TRACER +static int ksym_selftest_dummy; + +int +trace_selftest_startup_ksym(struct tracer *trace, struct trace_array *tr) +{ +	unsigned long count; +	int ret; + +	/* start the tracing */ +	ret = tracer_init(trace, tr); +	if (ret) { +		warn_failed_init_tracer(trace, ret); +		return ret; +	} + +	ksym_selftest_dummy = 0; +	/* Register the read-write tracing request */ +	ret = process_new_ksym_entry(KSYM_SELFTEST_ENTRY, HW_BREAKPOINT_RW, +					(unsigned long)(&ksym_selftest_dummy)); + +	if (ret < 0) { +		printk(KERN_CONT "ksym_trace read-write startup test failed\n"); +		goto ret_path; +	} +	/* Perform a read and a write operation over the dummy variable to +	 * trigger the tracer +	 */ +	if (ksym_selftest_dummy == 0) +		ksym_selftest_dummy++; + +	/* stop the tracing. */ +	tracing_stop(); +	/* check the trace buffer */ +	ret = trace_test_buffer(tr, &count); +	trace->reset(tr); +	tracing_start(); + +	/* read & write operations - one each is performed on the dummy variable +	 * triggering two entries in the trace buffer +	 */ +	if (!ret && count != 2) { +		printk(KERN_CONT "Ksym tracer startup test failed"); +		ret = -1; +	} + +ret_path: +	return ret; +} +#endif /* CONFIG_KSYM_TRACER */ +  |