aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_selftest.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/trace_selftest.c')
-rw-r--r--kernel/trace/trace_selftest.c91
1 files changed, 74 insertions, 17 deletions
diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c
index bc8e80a86bca..f907a2b29028 100644
--- a/kernel/trace/trace_selftest.c
+++ b/kernel/trace/trace_selftest.c
@@ -1,5 +1,6 @@
1/* Include in trace.c */ 1/* Include in trace.c */
2 2
3#include <linux/stringify.h>
3#include <linux/kthread.h> 4#include <linux/kthread.h>
4#include <linux/delay.h> 5#include <linux/delay.h>
5 6
@@ -9,11 +10,12 @@ static inline int trace_valid_entry(struct trace_entry *entry)
9 case TRACE_FN: 10 case TRACE_FN:
10 case TRACE_CTX: 11 case TRACE_CTX:
11 case TRACE_WAKE: 12 case TRACE_WAKE:
12 case TRACE_CONT:
13 case TRACE_STACK: 13 case TRACE_STACK:
14 case TRACE_PRINT: 14 case TRACE_PRINT:
15 case TRACE_SPECIAL: 15 case TRACE_SPECIAL:
16 case TRACE_BRANCH: 16 case TRACE_BRANCH:
17 case TRACE_GRAPH_ENT:
18 case TRACE_GRAPH_RET:
17 return 1; 19 return 1;
18 } 20 }
19 return 0; 21 return 0;
@@ -99,9 +101,6 @@ static inline void warn_failed_init_tracer(struct tracer *trace, int init_ret)
99 101
100#ifdef CONFIG_DYNAMIC_FTRACE 102#ifdef CONFIG_DYNAMIC_FTRACE
101 103
102#define __STR(x) #x
103#define STR(x) __STR(x)
104
105/* Test dynamic code modification and ftrace filters */ 104/* Test dynamic code modification and ftrace filters */
106int trace_selftest_startup_dynamic_tracing(struct tracer *trace, 105int trace_selftest_startup_dynamic_tracing(struct tracer *trace,
107 struct trace_array *tr, 106 struct trace_array *tr,
@@ -125,17 +124,17 @@ int trace_selftest_startup_dynamic_tracing(struct tracer *trace,
125 func(); 124 func();
126 125
127 /* 126 /*
128 * Some archs *cough*PowerPC*cough* add charachters to the 127 * Some archs *cough*PowerPC*cough* add characters to the
129 * start of the function names. We simply put a '*' to 128 * start of the function names. We simply put a '*' to
130 * accomodate them. 129 * accommodate them.
131 */ 130 */
132 func_name = "*" STR(DYN_FTRACE_TEST_NAME); 131 func_name = "*" __stringify(DYN_FTRACE_TEST_NAME);
133 132
134 /* filter only on our function */ 133 /* filter only on our function */
135 ftrace_set_filter(func_name, strlen(func_name), 1); 134 ftrace_set_filter(func_name, strlen(func_name), 1);
136 135
137 /* enable tracing */ 136 /* enable tracing */
138 ret = trace->init(tr); 137 ret = tracer_init(trace, tr);
139 if (ret) { 138 if (ret) {
140 warn_failed_init_tracer(trace, ret); 139 warn_failed_init_tracer(trace, ret);
141 goto out; 140 goto out;
@@ -209,7 +208,7 @@ trace_selftest_startup_function(struct tracer *trace, struct trace_array *tr)
209 ftrace_enabled = 1; 208 ftrace_enabled = 1;
210 tracer_enabled = 1; 209 tracer_enabled = 1;
211 210
212 ret = trace->init(tr); 211 ret = tracer_init(trace, tr);
213 if (ret) { 212 if (ret) {
214 warn_failed_init_tracer(trace, ret); 213 warn_failed_init_tracer(trace, ret);
215 goto out; 214 goto out;
@@ -247,6 +246,54 @@ trace_selftest_startup_function(struct tracer *trace, struct trace_array *tr)
247} 246}
248#endif /* CONFIG_FUNCTION_TRACER */ 247#endif /* CONFIG_FUNCTION_TRACER */
249 248
249
250#ifdef CONFIG_FUNCTION_GRAPH_TRACER
251/*
252 * Pretty much the same than for the function tracer from which the selftest
253 * has been borrowed.
254 */
255int
256trace_selftest_startup_function_graph(struct tracer *trace,
257 struct trace_array *tr)
258{
259 int ret;
260 unsigned long count;
261
262 ret = tracer_init(trace, tr);
263 if (ret) {
264 warn_failed_init_tracer(trace, ret);
265 goto out;
266 }
267
268 /* Sleep for a 1/10 of a second */
269 msleep(100);
270
271 tracing_stop();
272
273 /* check the trace buffer */
274 ret = trace_test_buffer(tr, &count);
275
276 trace->reset(tr);
277 tracing_start();
278
279 if (!ret && !count) {
280 printk(KERN_CONT ".. no entries found ..");
281 ret = -1;
282 goto out;
283 }
284
285 /* Don't test dynamic tracing, the function tracer already did */
286
287out:
288 /* Stop it if we failed */
289 if (ret)
290 ftrace_graph_stop();
291
292 return ret;
293}
294#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
295
296
250#ifdef CONFIG_IRQSOFF_TRACER 297#ifdef CONFIG_IRQSOFF_TRACER
251int 298int
252trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr) 299trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr)
@@ -256,7 +303,7 @@ trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr)
256 int ret; 303 int ret;
257 304
258 /* start the tracing */ 305 /* start the tracing */
259 ret = trace->init(tr); 306 ret = tracer_init(trace, tr);
260 if (ret) { 307 if (ret) {
261 warn_failed_init_tracer(trace, ret); 308 warn_failed_init_tracer(trace, ret);
262 return ret; 309 return ret;
@@ -310,7 +357,7 @@ trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr)
310 } 357 }
311 358
312 /* start the tracing */ 359 /* start the tracing */
313 ret = trace->init(tr); 360 ret = tracer_init(trace, tr);
314 if (ret) { 361 if (ret) {
315 warn_failed_init_tracer(trace, ret); 362 warn_failed_init_tracer(trace, ret);
316 return ret; 363 return ret;
@@ -364,7 +411,7 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array *
364 } 411 }
365 412
366 /* start the tracing */ 413 /* start the tracing */
367 ret = trace->init(tr); 414 ret = tracer_init(trace, tr);
368 if (ret) { 415 if (ret) {
369 warn_failed_init_tracer(trace, ret); 416 warn_failed_init_tracer(trace, ret);
370 goto out; 417 goto out;
@@ -496,7 +543,7 @@ trace_selftest_startup_wakeup(struct tracer *trace, struct trace_array *tr)
496 wait_for_completion(&isrt); 543 wait_for_completion(&isrt);
497 544
498 /* start the tracing */ 545 /* start the tracing */
499 ret = trace->init(tr); 546 ret = tracer_init(trace, tr);
500 if (ret) { 547 if (ret) {
501 warn_failed_init_tracer(trace, ret); 548 warn_failed_init_tracer(trace, ret);
502 return ret; 549 return ret;
@@ -557,7 +604,7 @@ trace_selftest_startup_sched_switch(struct tracer *trace, struct trace_array *tr
557 int ret; 604 int ret;
558 605
559 /* start the tracing */ 606 /* start the tracing */
560 ret = trace->init(tr); 607 ret = tracer_init(trace, tr);
561 if (ret) { 608 if (ret) {
562 warn_failed_init_tracer(trace, ret); 609 warn_failed_init_tracer(trace, ret);
563 return ret; 610 return ret;
@@ -589,10 +636,10 @@ trace_selftest_startup_sysprof(struct tracer *trace, struct trace_array *tr)
589 int ret; 636 int ret;
590 637
591 /* start the tracing */ 638 /* start the tracing */
592 ret = trace->init(tr); 639 ret = tracer_init(trace, tr);
593 if (ret) { 640 if (ret) {
594 warn_failed_init_tracer(trace, ret); 641 warn_failed_init_tracer(trace, ret);
595 return 0; 642 return ret;
596 } 643 }
597 644
598 /* Sleep for a 1/10 of a second */ 645 /* Sleep for a 1/10 of a second */
@@ -604,6 +651,11 @@ trace_selftest_startup_sysprof(struct tracer *trace, struct trace_array *tr)
604 trace->reset(tr); 651 trace->reset(tr);
605 tracing_start(); 652 tracing_start();
606 653
654 if (!ret && !count) {
655 printk(KERN_CONT ".. no entries found ..");
656 ret = -1;
657 }
658
607 return ret; 659 return ret;
608} 660}
609#endif /* CONFIG_SYSPROF_TRACER */ 661#endif /* CONFIG_SYSPROF_TRACER */
@@ -616,7 +668,7 @@ trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr)
616 int ret; 668 int ret;
617 669
618 /* start the tracing */ 670 /* start the tracing */
619 ret = trace->init(tr); 671 ret = tracer_init(trace, tr);
620 if (ret) { 672 if (ret) {
621 warn_failed_init_tracer(trace, ret); 673 warn_failed_init_tracer(trace, ret);
622 return ret; 674 return ret;
@@ -631,6 +683,11 @@ trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr)
631 trace->reset(tr); 683 trace->reset(tr);
632 tracing_start(); 684 tracing_start();
633 685
686 if (!ret && !count) {
687 printk(KERN_CONT ".. no entries found ..");
688 ret = -1;
689 }
690
634 return ret; 691 return ret;
635} 692}
636#endif /* CONFIG_BRANCH_TRACER */ 693#endif /* CONFIG_BRANCH_TRACER */