diff options
-rw-r--r-- | kernel/trace/trace.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 7a93c663e52a..33549537f30f 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -44,13 +44,14 @@ | |||
44 | unsigned long __read_mostly tracing_max_latency = (cycle_t)ULONG_MAX; | 44 | unsigned long __read_mostly tracing_max_latency = (cycle_t)ULONG_MAX; |
45 | unsigned long __read_mostly tracing_thresh; | 45 | unsigned long __read_mostly tracing_thresh; |
46 | 46 | ||
47 | /* We need to change this state when a selftest is running. | 47 | /* |
48 | * We need to change this state when a selftest is running. | ||
48 | * A selftest will lurk into the ring-buffer to count the | 49 | * A selftest will lurk into the ring-buffer to count the |
49 | * entries inserted during the selftest although some concurrent | 50 | * entries inserted during the selftest although some concurrent |
50 | * insertions into the ring-buffer such as ftrace_printk could occurred | 51 | * insertions into the ring-buffer such as ftrace_printk could occurred |
51 | * at the same time, giving false positive or negative results. | 52 | * at the same time, giving false positive or negative results. |
52 | */ | 53 | */ |
53 | static atomic_t tracing_selftest_running = ATOMIC_INIT(0); | 54 | static bool __read_mostly tracing_selftest_running; |
54 | 55 | ||
55 | /* For tracers that don't implement custom flags */ | 56 | /* For tracers that don't implement custom flags */ |
56 | static struct tracer_opt dummy_tracer_opt[] = { | 57 | static struct tracer_opt dummy_tracer_opt[] = { |
@@ -574,6 +575,8 @@ int register_tracer(struct tracer *type) | |||
574 | unlock_kernel(); | 575 | unlock_kernel(); |
575 | mutex_lock(&trace_types_lock); | 576 | mutex_lock(&trace_types_lock); |
576 | 577 | ||
578 | tracing_selftest_running = true; | ||
579 | |||
577 | for (t = trace_types; t; t = t->next) { | 580 | for (t = trace_types; t; t = t->next) { |
578 | if (strcmp(type->name, t->name) == 0) { | 581 | if (strcmp(type->name, t->name) == 0) { |
579 | /* already found */ | 582 | /* already found */ |
@@ -598,7 +601,6 @@ int register_tracer(struct tracer *type) | |||
598 | struct trace_array *tr = &global_trace; | 601 | struct trace_array *tr = &global_trace; |
599 | int i; | 602 | int i; |
600 | 603 | ||
601 | atomic_set(&tracing_selftest_running, 1); | ||
602 | /* | 604 | /* |
603 | * Run a selftest on this tracer. | 605 | * Run a selftest on this tracer. |
604 | * Here we reset the trace buffer, and set the current | 606 | * Here we reset the trace buffer, and set the current |
@@ -613,7 +615,6 @@ int register_tracer(struct tracer *type) | |||
613 | /* the test is responsible for initializing and enabling */ | 615 | /* the test is responsible for initializing and enabling */ |
614 | pr_info("Testing tracer %s: ", type->name); | 616 | pr_info("Testing tracer %s: ", type->name); |
615 | ret = type->selftest(type, tr); | 617 | ret = type->selftest(type, tr); |
616 | atomic_set(&tracing_selftest_running, 0); | ||
617 | /* the test is responsible for resetting too */ | 618 | /* the test is responsible for resetting too */ |
618 | current_trace = saved_tracer; | 619 | current_trace = saved_tracer; |
619 | if (ret) { | 620 | if (ret) { |
@@ -635,6 +636,7 @@ int register_tracer(struct tracer *type) | |||
635 | max_tracer_type_len = len; | 636 | max_tracer_type_len = len; |
636 | 637 | ||
637 | out: | 638 | out: |
639 | tracing_selftest_running = false; | ||
638 | mutex_unlock(&trace_types_lock); | 640 | mutex_unlock(&trace_types_lock); |
639 | lock_kernel(); | 641 | lock_kernel(); |
640 | 642 | ||
@@ -3605,7 +3607,7 @@ int trace_vprintk(unsigned long ip, int depth, const char *fmt, va_list args) | |||
3605 | unsigned long flags, irq_flags; | 3607 | unsigned long flags, irq_flags; |
3606 | int cpu, len = 0, size, pc; | 3608 | int cpu, len = 0, size, pc; |
3607 | 3609 | ||
3608 | if (tracing_disabled || atomic_read(&tracing_selftest_running)) | 3610 | if (tracing_disabled || tracing_selftest_running) |
3609 | return 0; | 3611 | return 0; |
3610 | 3612 | ||
3611 | pc = preempt_count(); | 3613 | pc = preempt_count(); |