diff options
-rw-r--r-- | kernel/trace/trace.c | 7 | ||||
-rw-r--r-- | kernel/trace/trace.h | 3 | ||||
-rw-r--r-- | kernel/trace/trace_boot.c | 3 | ||||
-rw-r--r-- | kernel/trace/trace_branch.c | 3 | ||||
-rw-r--r-- | kernel/trace/trace_functions.c | 3 | ||||
-rw-r--r-- | kernel/trace/trace_functions_return.c | 3 | ||||
-rw-r--r-- | kernel/trace/trace_irqsoff.c | 9 | ||||
-rw-r--r-- | kernel/trace/trace_mmiotrace.c | 3 | ||||
-rw-r--r-- | kernel/trace/trace_nop.c | 3 | ||||
-rw-r--r-- | kernel/trace/trace_sched_switch.c | 3 | ||||
-rw-r--r-- | kernel/trace/trace_sched_wakeup.c | 3 | ||||
-rw-r--r-- | kernel/trace/trace_selftest.c | 66 | ||||
-rw-r--r-- | kernel/trace/trace_sysprof.c | 3 |
13 files changed, 88 insertions, 24 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 80898f4870cc..396fda034e3f 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -2638,8 +2638,11 @@ static int tracing_set_tracer(char *buf) | |||
2638 | current_trace->reset(tr); | 2638 | current_trace->reset(tr); |
2639 | 2639 | ||
2640 | current_trace = t; | 2640 | current_trace = t; |
2641 | if (t->init) | 2641 | if (t->init) { |
2642 | t->init(tr); | 2642 | ret = t->init(tr); |
2643 | if (ret) | ||
2644 | goto out; | ||
2645 | } | ||
2643 | 2646 | ||
2644 | trace_branch_enable(tr); | 2647 | trace_branch_enable(tr); |
2645 | out: | 2648 | out: |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 790ea8c0e1f3..cdbd5cc22be8 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
@@ -264,7 +264,8 @@ enum print_line_t { | |||
264 | */ | 264 | */ |
265 | struct tracer { | 265 | struct tracer { |
266 | const char *name; | 266 | const char *name; |
267 | void (*init)(struct trace_array *tr); | 267 | /* Your tracer should raise a warning if init fails */ |
268 | int (*init)(struct trace_array *tr); | ||
268 | void (*reset)(struct trace_array *tr); | 269 | void (*reset)(struct trace_array *tr); |
269 | void (*start)(struct trace_array *tr); | 270 | void (*start)(struct trace_array *tr); |
270 | void (*stop)(struct trace_array *tr); | 271 | void (*stop)(struct trace_array *tr); |
diff --git a/kernel/trace/trace_boot.c b/kernel/trace/trace_boot.c index cb333b7fd113..a4fa2c57e34e 100644 --- a/kernel/trace/trace_boot.c +++ b/kernel/trace/trace_boot.c | |||
@@ -47,7 +47,7 @@ static void reset_boot_trace(struct trace_array *tr) | |||
47 | tracing_reset(tr, cpu); | 47 | tracing_reset(tr, cpu); |
48 | } | 48 | } |
49 | 49 | ||
50 | static void boot_trace_init(struct trace_array *tr) | 50 | static int boot_trace_init(struct trace_array *tr) |
51 | { | 51 | { |
52 | int cpu; | 52 | int cpu; |
53 | boot_trace = tr; | 53 | boot_trace = tr; |
@@ -56,6 +56,7 @@ static void boot_trace_init(struct trace_array *tr) | |||
56 | tracing_reset(tr, cpu); | 56 | tracing_reset(tr, cpu); |
57 | 57 | ||
58 | tracing_sched_switch_assign_trace(tr); | 58 | tracing_sched_switch_assign_trace(tr); |
59 | return 0; | ||
59 | } | 60 | } |
60 | 61 | ||
61 | static enum print_line_t | 62 | static enum print_line_t |
diff --git a/kernel/trace/trace_branch.c b/kernel/trace/trace_branch.c index 85265553918f..44bd39539d61 100644 --- a/kernel/trace/trace_branch.c +++ b/kernel/trace/trace_branch.c | |||
@@ -125,7 +125,7 @@ static void stop_branch_trace(struct trace_array *tr) | |||
125 | disable_branch_tracing(); | 125 | disable_branch_tracing(); |
126 | } | 126 | } |
127 | 127 | ||
128 | static void branch_trace_init(struct trace_array *tr) | 128 | static int branch_trace_init(struct trace_array *tr) |
129 | { | 129 | { |
130 | int cpu; | 130 | int cpu; |
131 | 131 | ||
@@ -133,6 +133,7 @@ static void branch_trace_init(struct trace_array *tr) | |||
133 | tracing_reset(tr, cpu); | 133 | tracing_reset(tr, cpu); |
134 | 134 | ||
135 | start_branch_trace(tr); | 135 | start_branch_trace(tr); |
136 | return 0; | ||
136 | } | 137 | } |
137 | 138 | ||
138 | static void branch_trace_reset(struct trace_array *tr) | 139 | static void branch_trace_reset(struct trace_array *tr) |
diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c index 8693b7a0a5b2..e74f6d0a3216 100644 --- a/kernel/trace/trace_functions.c +++ b/kernel/trace/trace_functions.c | |||
@@ -42,9 +42,10 @@ static void stop_function_trace(struct trace_array *tr) | |||
42 | tracing_stop_cmdline_record(); | 42 | tracing_stop_cmdline_record(); |
43 | } | 43 | } |
44 | 44 | ||
45 | static void function_trace_init(struct trace_array *tr) | 45 | static int function_trace_init(struct trace_array *tr) |
46 | { | 46 | { |
47 | start_function_trace(tr); | 47 | start_function_trace(tr); |
48 | return 0; | ||
48 | } | 49 | } |
49 | 50 | ||
50 | static void function_trace_reset(struct trace_array *tr) | 51 | static void function_trace_reset(struct trace_array *tr) |
diff --git a/kernel/trace/trace_functions_return.c b/kernel/trace/trace_functions_return.c index 7680b21537dd..61185f756a13 100644 --- a/kernel/trace/trace_functions_return.c +++ b/kernel/trace/trace_functions_return.c | |||
@@ -24,13 +24,14 @@ static void stop_return_trace(struct trace_array *tr) | |||
24 | unregister_ftrace_return(); | 24 | unregister_ftrace_return(); |
25 | } | 25 | } |
26 | 26 | ||
27 | static void return_trace_init(struct trace_array *tr) | 27 | static int return_trace_init(struct trace_array *tr) |
28 | { | 28 | { |
29 | int cpu; | 29 | int cpu; |
30 | for_each_online_cpu(cpu) | 30 | for_each_online_cpu(cpu) |
31 | tracing_reset(tr, cpu); | 31 | tracing_reset(tr, cpu); |
32 | 32 | ||
33 | start_return_trace(tr); | 33 | start_return_trace(tr); |
34 | return 0; | ||
34 | } | 35 | } |
35 | 36 | ||
36 | static void return_trace_reset(struct trace_array *tr) | 37 | static void return_trace_reset(struct trace_array *tr) |
diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c index d919d4eaa7cc..7c2e326bbc8b 100644 --- a/kernel/trace/trace_irqsoff.c +++ b/kernel/trace/trace_irqsoff.c | |||
@@ -416,11 +416,12 @@ static void irqsoff_tracer_close(struct trace_iterator *iter) | |||
416 | } | 416 | } |
417 | 417 | ||
418 | #ifdef CONFIG_IRQSOFF_TRACER | 418 | #ifdef CONFIG_IRQSOFF_TRACER |
419 | static void irqsoff_tracer_init(struct trace_array *tr) | 419 | static int irqsoff_tracer_init(struct trace_array *tr) |
420 | { | 420 | { |
421 | trace_type = TRACER_IRQS_OFF; | 421 | trace_type = TRACER_IRQS_OFF; |
422 | 422 | ||
423 | __irqsoff_tracer_init(tr); | 423 | __irqsoff_tracer_init(tr); |
424 | return 0; | ||
424 | } | 425 | } |
425 | static struct tracer irqsoff_tracer __read_mostly = | 426 | static struct tracer irqsoff_tracer __read_mostly = |
426 | { | 427 | { |
@@ -442,11 +443,12 @@ static struct tracer irqsoff_tracer __read_mostly = | |||
442 | #endif | 443 | #endif |
443 | 444 | ||
444 | #ifdef CONFIG_PREEMPT_TRACER | 445 | #ifdef CONFIG_PREEMPT_TRACER |
445 | static void preemptoff_tracer_init(struct trace_array *tr) | 446 | static int preemptoff_tracer_init(struct trace_array *tr) |
446 | { | 447 | { |
447 | trace_type = TRACER_PREEMPT_OFF; | 448 | trace_type = TRACER_PREEMPT_OFF; |
448 | 449 | ||
449 | __irqsoff_tracer_init(tr); | 450 | __irqsoff_tracer_init(tr); |
451 | return 0; | ||
450 | } | 452 | } |
451 | 453 | ||
452 | static struct tracer preemptoff_tracer __read_mostly = | 454 | static struct tracer preemptoff_tracer __read_mostly = |
@@ -471,11 +473,12 @@ static struct tracer preemptoff_tracer __read_mostly = | |||
471 | #if defined(CONFIG_IRQSOFF_TRACER) && \ | 473 | #if defined(CONFIG_IRQSOFF_TRACER) && \ |
472 | defined(CONFIG_PREEMPT_TRACER) | 474 | defined(CONFIG_PREEMPT_TRACER) |
473 | 475 | ||
474 | static void preemptirqsoff_tracer_init(struct trace_array *tr) | 476 | static int preemptirqsoff_tracer_init(struct trace_array *tr) |
475 | { | 477 | { |
476 | trace_type = TRACER_IRQS_OFF | TRACER_PREEMPT_OFF; | 478 | trace_type = TRACER_IRQS_OFF | TRACER_PREEMPT_OFF; |
477 | 479 | ||
478 | __irqsoff_tracer_init(tr); | 480 | __irqsoff_tracer_init(tr); |
481 | return 0; | ||
479 | } | 482 | } |
480 | 483 | ||
481 | static struct tracer preemptirqsoff_tracer __read_mostly = | 484 | static struct tracer preemptirqsoff_tracer __read_mostly = |
diff --git a/kernel/trace/trace_mmiotrace.c b/kernel/trace/trace_mmiotrace.c index 51bcf370215e..433d650eda9f 100644 --- a/kernel/trace/trace_mmiotrace.c +++ b/kernel/trace/trace_mmiotrace.c | |||
@@ -30,13 +30,14 @@ static void mmio_reset_data(struct trace_array *tr) | |||
30 | tracing_reset(tr, cpu); | 30 | tracing_reset(tr, cpu); |
31 | } | 31 | } |
32 | 32 | ||
33 | static void mmio_trace_init(struct trace_array *tr) | 33 | static int mmio_trace_init(struct trace_array *tr) |
34 | { | 34 | { |
35 | pr_debug("in %s\n", __func__); | 35 | pr_debug("in %s\n", __func__); |
36 | mmio_trace_array = tr; | 36 | mmio_trace_array = tr; |
37 | 37 | ||
38 | mmio_reset_data(tr); | 38 | mmio_reset_data(tr); |
39 | enable_mmiotrace(); | 39 | enable_mmiotrace(); |
40 | return 0; | ||
40 | } | 41 | } |
41 | 42 | ||
42 | static void mmio_trace_reset(struct trace_array *tr) | 43 | static void mmio_trace_reset(struct trace_array *tr) |
diff --git a/kernel/trace/trace_nop.c b/kernel/trace/trace_nop.c index 2ef1d227e7d8..0e77415caed3 100644 --- a/kernel/trace/trace_nop.c +++ b/kernel/trace/trace_nop.c | |||
@@ -24,7 +24,7 @@ static void stop_nop_trace(struct trace_array *tr) | |||
24 | /* Nothing to do! */ | 24 | /* Nothing to do! */ |
25 | } | 25 | } |
26 | 26 | ||
27 | static void nop_trace_init(struct trace_array *tr) | 27 | static int nop_trace_init(struct trace_array *tr) |
28 | { | 28 | { |
29 | int cpu; | 29 | int cpu; |
30 | ctx_trace = tr; | 30 | ctx_trace = tr; |
@@ -33,6 +33,7 @@ static void nop_trace_init(struct trace_array *tr) | |||
33 | tracing_reset(tr, cpu); | 33 | tracing_reset(tr, cpu); |
34 | 34 | ||
35 | start_nop_trace(tr); | 35 | start_nop_trace(tr); |
36 | return 0; | ||
36 | } | 37 | } |
37 | 38 | ||
38 | static void nop_trace_reset(struct trace_array *tr) | 39 | static void nop_trace_reset(struct trace_array *tr) |
diff --git a/kernel/trace/trace_sched_switch.c b/kernel/trace/trace_sched_switch.c index be35bdfe2e38..863390557b44 100644 --- a/kernel/trace/trace_sched_switch.c +++ b/kernel/trace/trace_sched_switch.c | |||
@@ -206,10 +206,11 @@ static void stop_sched_trace(struct trace_array *tr) | |||
206 | tracing_stop_sched_switch_record(); | 206 | tracing_stop_sched_switch_record(); |
207 | } | 207 | } |
208 | 208 | ||
209 | static void sched_switch_trace_init(struct trace_array *tr) | 209 | static int sched_switch_trace_init(struct trace_array *tr) |
210 | { | 210 | { |
211 | ctx_trace = tr; | 211 | ctx_trace = tr; |
212 | start_sched_trace(tr); | 212 | start_sched_trace(tr); |
213 | return 0; | ||
213 | } | 214 | } |
214 | 215 | ||
215 | static void sched_switch_trace_reset(struct trace_array *tr) | 216 | static void sched_switch_trace_reset(struct trace_array *tr) |
diff --git a/kernel/trace/trace_sched_wakeup.c b/kernel/trace/trace_sched_wakeup.c index 983f2b1478c9..0067b49746c1 100644 --- a/kernel/trace/trace_sched_wakeup.c +++ b/kernel/trace/trace_sched_wakeup.c | |||
@@ -331,10 +331,11 @@ static void stop_wakeup_tracer(struct trace_array *tr) | |||
331 | unregister_trace_sched_wakeup(probe_wakeup); | 331 | unregister_trace_sched_wakeup(probe_wakeup); |
332 | } | 332 | } |
333 | 333 | ||
334 | static void wakeup_tracer_init(struct trace_array *tr) | 334 | static int wakeup_tracer_init(struct trace_array *tr) |
335 | { | 335 | { |
336 | wakeup_trace = tr; | 336 | wakeup_trace = tr; |
337 | start_wakeup_tracer(tr); | 337 | start_wakeup_tracer(tr); |
338 | return 0; | ||
338 | } | 339 | } |
339 | 340 | ||
340 | static void wakeup_tracer_reset(struct trace_array *tr) | 341 | static void wakeup_tracer_reset(struct trace_array *tr) |
diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c index 5cb64ea061b5..88c8eb70f54a 100644 --- a/kernel/trace/trace_selftest.c +++ b/kernel/trace/trace_selftest.c | |||
@@ -71,6 +71,11 @@ static int trace_test_buffer(struct trace_array *tr, unsigned long *count) | |||
71 | return ret; | 71 | return ret; |
72 | } | 72 | } |
73 | 73 | ||
74 | static inline void warn_failed_init_tracer(struct tracer *trace, int init_ret) | ||
75 | { | ||
76 | printk(KERN_WARNING "Failed to init %s tracer, init returned %d\n", | ||
77 | trace->name, init_ret); | ||
78 | } | ||
74 | #ifdef CONFIG_FUNCTION_TRACER | 79 | #ifdef CONFIG_FUNCTION_TRACER |
75 | 80 | ||
76 | #ifdef CONFIG_DYNAMIC_FTRACE | 81 | #ifdef CONFIG_DYNAMIC_FTRACE |
@@ -111,7 +116,11 @@ int trace_selftest_startup_dynamic_tracing(struct tracer *trace, | |||
111 | ftrace_set_filter(func_name, strlen(func_name), 1); | 116 | ftrace_set_filter(func_name, strlen(func_name), 1); |
112 | 117 | ||
113 | /* enable tracing */ | 118 | /* enable tracing */ |
114 | trace->init(tr); | 119 | ret = trace->init(tr); |
120 | if (ret) { | ||
121 | warn_failed_init_tracer(trace, ret); | ||
122 | goto out; | ||
123 | } | ||
115 | 124 | ||
116 | /* Sleep for a 1/10 of a second */ | 125 | /* Sleep for a 1/10 of a second */ |
117 | msleep(100); | 126 | msleep(100); |
@@ -181,7 +190,12 @@ trace_selftest_startup_function(struct tracer *trace, struct trace_array *tr) | |||
181 | ftrace_enabled = 1; | 190 | ftrace_enabled = 1; |
182 | tracer_enabled = 1; | 191 | tracer_enabled = 1; |
183 | 192 | ||
184 | trace->init(tr); | 193 | ret = trace->init(tr); |
194 | if (ret) { | ||
195 | warn_failed_init_tracer(trace, ret); | ||
196 | goto out; | ||
197 | } | ||
198 | |||
185 | /* Sleep for a 1/10 of a second */ | 199 | /* Sleep for a 1/10 of a second */ |
186 | msleep(100); | 200 | msleep(100); |
187 | /* stop the tracing. */ | 201 | /* stop the tracing. */ |
@@ -223,7 +237,12 @@ trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr) | |||
223 | int ret; | 237 | int ret; |
224 | 238 | ||
225 | /* start the tracing */ | 239 | /* start the tracing */ |
226 | trace->init(tr); | 240 | ret = trace->init(tr); |
241 | if (ret) { | ||
242 | warn_failed_init_tracer(trace, ret); | ||
243 | return ret; | ||
244 | } | ||
245 | |||
227 | /* reset the max latency */ | 246 | /* reset the max latency */ |
228 | tracing_max_latency = 0; | 247 | tracing_max_latency = 0; |
229 | /* disable interrupts for a bit */ | 248 | /* disable interrupts for a bit */ |
@@ -272,7 +291,12 @@ trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr) | |||
272 | } | 291 | } |
273 | 292 | ||
274 | /* start the tracing */ | 293 | /* start the tracing */ |
275 | trace->init(tr); | 294 | ret = trace->init(tr); |
295 | if (ret) { | ||
296 | warn_failed_init_tracer(trace, ret); | ||
297 | return ret; | ||
298 | } | ||
299 | |||
276 | /* reset the max latency */ | 300 | /* reset the max latency */ |
277 | tracing_max_latency = 0; | 301 | tracing_max_latency = 0; |
278 | /* disable preemption for a bit */ | 302 | /* disable preemption for a bit */ |
@@ -321,7 +345,11 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array * | |||
321 | } | 345 | } |
322 | 346 | ||
323 | /* start the tracing */ | 347 | /* start the tracing */ |
324 | trace->init(tr); | 348 | ret = trace->init(tr); |
349 | if (ret) { | ||
350 | warn_failed_init_tracer(trace, ret); | ||
351 | goto out; | ||
352 | } | ||
325 | 353 | ||
326 | /* reset the max latency */ | 354 | /* reset the max latency */ |
327 | tracing_max_latency = 0; | 355 | tracing_max_latency = 0; |
@@ -449,7 +477,12 @@ trace_selftest_startup_wakeup(struct tracer *trace, struct trace_array *tr) | |||
449 | wait_for_completion(&isrt); | 477 | wait_for_completion(&isrt); |
450 | 478 | ||
451 | /* start the tracing */ | 479 | /* start the tracing */ |
452 | trace->init(tr); | 480 | ret = trace->init(tr); |
481 | if (ret) { | ||
482 | warn_failed_init_tracer(trace, ret); | ||
483 | return ret; | ||
484 | } | ||
485 | |||
453 | /* reset the max latency */ | 486 | /* reset the max latency */ |
454 | tracing_max_latency = 0; | 487 | tracing_max_latency = 0; |
455 | 488 | ||
@@ -505,7 +538,12 @@ trace_selftest_startup_sched_switch(struct tracer *trace, struct trace_array *tr | |||
505 | int ret; | 538 | int ret; |
506 | 539 | ||
507 | /* start the tracing */ | 540 | /* start the tracing */ |
508 | trace->init(tr); | 541 | ret = trace->init(tr); |
542 | if (ret) { | ||
543 | warn_failed_init_tracer(trace, ret); | ||
544 | return ret; | ||
545 | } | ||
546 | |||
509 | /* Sleep for a 1/10 of a second */ | 547 | /* Sleep for a 1/10 of a second */ |
510 | msleep(100); | 548 | msleep(100); |
511 | /* stop the tracing. */ | 549 | /* stop the tracing. */ |
@@ -532,7 +570,12 @@ trace_selftest_startup_sysprof(struct tracer *trace, struct trace_array *tr) | |||
532 | int ret; | 570 | int ret; |
533 | 571 | ||
534 | /* start the tracing */ | 572 | /* start the tracing */ |
535 | trace->init(tr); | 573 | ret = trace->init(tr); |
574 | if (ret) { | ||
575 | warn_failed_init_tracer(trace, ret); | ||
576 | return 0; | ||
577 | } | ||
578 | |||
536 | /* Sleep for a 1/10 of a second */ | 579 | /* Sleep for a 1/10 of a second */ |
537 | msleep(100); | 580 | msleep(100); |
538 | /* stop the tracing. */ | 581 | /* stop the tracing. */ |
@@ -554,7 +597,12 @@ trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr) | |||
554 | int ret; | 597 | int ret; |
555 | 598 | ||
556 | /* start the tracing */ | 599 | /* start the tracing */ |
557 | trace->init(tr); | 600 | ret = trace->init(tr); |
601 | if (ret) { | ||
602 | warn_failed_init_tracer(trace, ret); | ||
603 | return ret; | ||
604 | } | ||
605 | |||
558 | /* Sleep for a 1/10 of a second */ | 606 | /* Sleep for a 1/10 of a second */ |
559 | msleep(100); | 607 | msleep(100); |
560 | /* stop the tracing. */ | 608 | /* stop the tracing. */ |
diff --git a/kernel/trace/trace_sysprof.c b/kernel/trace/trace_sysprof.c index 05f753422aea..54960edb96d0 100644 --- a/kernel/trace/trace_sysprof.c +++ b/kernel/trace/trace_sysprof.c | |||
@@ -261,11 +261,12 @@ static void stop_stack_trace(struct trace_array *tr) | |||
261 | mutex_unlock(&sample_timer_lock); | 261 | mutex_unlock(&sample_timer_lock); |
262 | } | 262 | } |
263 | 263 | ||
264 | static void stack_trace_init(struct trace_array *tr) | 264 | static int stack_trace_init(struct trace_array *tr) |
265 | { | 265 | { |
266 | sysprof_trace = tr; | 266 | sysprof_trace = tr; |
267 | 267 | ||
268 | start_stack_trace(tr); | 268 | start_stack_trace(tr); |
269 | return 0; | ||
269 | } | 270 | } |
270 | 271 | ||
271 | static void stack_trace_reset(struct trace_array *tr) | 272 | static void stack_trace_reset(struct trace_array *tr) |