diff options
Diffstat (limited to 'kernel/trace/trace_selftest.c')
-rw-r--r-- | kernel/trace/trace_selftest.c | 91 |
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 */ |
106 | int trace_selftest_startup_dynamic_tracing(struct tracer *trace, | 105 | int 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 | */ | ||
255 | int | ||
256 | trace_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 | |||
287 | out: | ||
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 |
251 | int | 298 | int |
252 | trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr) | 299 | trace_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 */ |