diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/trace/trace.c | 2 | ||||
| -rw-r--r-- | kernel/trace/trace.h | 1 | ||||
| -rw-r--r-- | kernel/trace/trace_boot.c | 6 | ||||
| -rw-r--r-- | kernel/trace/trace_sched_switch.c | 6 |
4 files changed, 12 insertions, 3 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index e4c40c868d6..50d7018163f 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -3251,6 +3251,8 @@ __init static int tracer_alloc_buffers(void) | |||
| 3251 | 3251 | ||
| 3252 | register_tracer(&nop_trace); | 3252 | register_tracer(&nop_trace); |
| 3253 | #ifdef CONFIG_BOOT_TRACER | 3253 | #ifdef CONFIG_BOOT_TRACER |
| 3254 | /* We don't want to launch sched_switch tracer yet */ | ||
| 3255 | global_trace.ctrl = 0; | ||
| 3254 | register_tracer(&boot_tracer); | 3256 | register_tracer(&boot_tracer); |
| 3255 | current_trace = &boot_tracer; | 3257 | current_trace = &boot_tracer; |
| 3256 | current_trace->init(&global_trace); | 3258 | current_trace->init(&global_trace); |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 8465ad05270..9911277b268 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
| @@ -49,6 +49,7 @@ struct ftrace_entry { | |||
| 49 | unsigned long parent_ip; | 49 | unsigned long parent_ip; |
| 50 | }; | 50 | }; |
| 51 | extern struct tracer boot_tracer; | 51 | extern struct tracer boot_tracer; |
| 52 | extern struct tracer sched_switch_trace; /* Used by the boot tracer */ | ||
| 52 | 53 | ||
| 53 | /* | 54 | /* |
| 54 | * Context switch trace entry - which task (and prio) we switched from/to: | 55 | * Context switch trace entry - which task (and prio) we switched from/to: |
diff --git a/kernel/trace/trace_boot.c b/kernel/trace/trace_boot.c index d104d5b4641..6bbc8794a6d 100644 --- a/kernel/trace/trace_boot.c +++ b/kernel/trace/trace_boot.c | |||
| @@ -27,10 +27,14 @@ void start_boot_trace(void) | |||
| 27 | 27 | ||
| 28 | void enable_boot_trace(void) | 28 | void enable_boot_trace(void) |
| 29 | { | 29 | { |
| 30 | if (pre_initcalls_finished) | ||
| 31 | tracing_start_cmdline_record(); | ||
| 30 | } | 32 | } |
| 31 | 33 | ||
| 32 | void disable_boot_trace(void) | 34 | void disable_boot_trace(void) |
| 33 | { | 35 | { |
| 36 | if (pre_initcalls_finished) | ||
| 37 | tracing_stop_cmdline_record(); | ||
| 34 | } | 38 | } |
| 35 | 39 | ||
| 36 | void reset_boot_trace(struct trace_array *tr) | 40 | void reset_boot_trace(struct trace_array *tr) |
| @@ -45,6 +49,8 @@ static void boot_trace_init(struct trace_array *tr) | |||
| 45 | 49 | ||
| 46 | for_each_cpu_mask(cpu, cpu_possible_map) | 50 | for_each_cpu_mask(cpu, cpu_possible_map) |
| 47 | tracing_reset(tr, cpu); | 51 | tracing_reset(tr, cpu); |
| 52 | |||
| 53 | sched_switch_trace.init(tr); | ||
| 48 | } | 54 | } |
| 49 | 55 | ||
| 50 | static void boot_trace_ctrl_update(struct trace_array *tr) | 56 | static void boot_trace_ctrl_update(struct trace_array *tr) |
diff --git a/kernel/trace/trace_sched_switch.c b/kernel/trace/trace_sched_switch.c index 96620c71430..9d7bdac331d 100644 --- a/kernel/trace/trace_sched_switch.c +++ b/kernel/trace/trace_sched_switch.c | |||
| @@ -127,6 +127,7 @@ static void tracing_start_sched_switch(void) | |||
| 127 | long ref; | 127 | long ref; |
| 128 | 128 | ||
| 129 | mutex_lock(&tracepoint_mutex); | 129 | mutex_lock(&tracepoint_mutex); |
| 130 | tracer_enabled = 1; | ||
| 130 | ref = atomic_inc_return(&sched_ref); | 131 | ref = atomic_inc_return(&sched_ref); |
| 131 | if (ref == 1) | 132 | if (ref == 1) |
| 132 | tracing_sched_register(); | 133 | tracing_sched_register(); |
| @@ -138,6 +139,7 @@ static void tracing_stop_sched_switch(void) | |||
| 138 | long ref; | 139 | long ref; |
| 139 | 140 | ||
| 140 | mutex_lock(&tracepoint_mutex); | 141 | mutex_lock(&tracepoint_mutex); |
| 142 | tracer_enabled = 0; | ||
| 141 | ref = atomic_dec_and_test(&sched_ref); | 143 | ref = atomic_dec_and_test(&sched_ref); |
| 142 | if (ref) | 144 | if (ref) |
| 143 | tracing_sched_unregister(); | 145 | tracing_sched_unregister(); |
| @@ -158,12 +160,10 @@ static void start_sched_trace(struct trace_array *tr) | |||
| 158 | { | 160 | { |
| 159 | sched_switch_reset(tr); | 161 | sched_switch_reset(tr); |
| 160 | tracing_start_cmdline_record(); | 162 | tracing_start_cmdline_record(); |
| 161 | tracer_enabled = 1; | ||
| 162 | } | 163 | } |
| 163 | 164 | ||
| 164 | static void stop_sched_trace(struct trace_array *tr) | 165 | static void stop_sched_trace(struct trace_array *tr) |
| 165 | { | 166 | { |
| 166 | tracer_enabled = 0; | ||
| 167 | tracing_stop_cmdline_record(); | 167 | tracing_stop_cmdline_record(); |
| 168 | } | 168 | } |
| 169 | 169 | ||
| @@ -190,7 +190,7 @@ static void sched_switch_trace_ctrl_update(struct trace_array *tr) | |||
| 190 | stop_sched_trace(tr); | 190 | stop_sched_trace(tr); |
| 191 | } | 191 | } |
| 192 | 192 | ||
| 193 | static struct tracer sched_switch_trace __read_mostly = | 193 | struct tracer sched_switch_trace __read_mostly = |
| 194 | { | 194 | { |
| 195 | .name = "sched_switch", | 195 | .name = "sched_switch", |
| 196 | .init = sched_switch_trace_init, | 196 | .init = sched_switch_trace_init, |
