aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/trace/trace.c3
-rw-r--r--kernel/trace/trace.h4
-rw-r--r--kernel/trace/trace_functions.c4
-rw-r--r--kernel/trace/trace_sched_switch.c21
4 files changed, 19 insertions, 13 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 583fe24903d3..0feae23d9893 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -652,9 +652,6 @@ static char saved_cmdlines[SAVED_CMDLINES][TASK_COMM_LEN];
652static int cmdline_idx; 652static int cmdline_idx;
653static DEFINE_SPINLOCK(trace_cmdline_lock); 653static DEFINE_SPINLOCK(trace_cmdline_lock);
654 654
655/* trace in all context switches */
656atomic_t trace_record_cmdline_enabled __read_mostly;
657
658/* temporary disable recording */ 655/* temporary disable recording */
659atomic_t trace_record_cmdline_disabled __read_mostly; 656atomic_t trace_record_cmdline_disabled __read_mostly;
660 657
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index c460e85e94ed..6b8bd8800d04 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -218,6 +218,8 @@ void trace_function(struct trace_array *tr,
218 218
219void tracing_start_function_trace(void); 219void tracing_start_function_trace(void);
220void tracing_stop_function_trace(void); 220void tracing_stop_function_trace(void);
221void tracing_start_cmdline_record(void);
222void tracing_stop_cmdline_record(void);
221int register_tracer(struct tracer *type); 223int register_tracer(struct tracer *type);
222void unregister_tracer(struct tracer *type); 224void unregister_tracer(struct tracer *type);
223 225
@@ -226,8 +228,6 @@ extern unsigned long nsecs_to_usecs(unsigned long nsecs);
226extern unsigned long tracing_max_latency; 228extern unsigned long tracing_max_latency;
227extern unsigned long tracing_thresh; 229extern unsigned long tracing_thresh;
228 230
229extern atomic_t trace_record_cmdline_enabled;
230
231void update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu); 231void update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu);
232void update_max_tr_single(struct trace_array *tr, 232void update_max_tr_single(struct trace_array *tr,
233 struct task_struct *tsk, int cpu); 233 struct task_struct *tsk, int cpu);
diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c
index 0a084656d7cf..7ee7dcd76b7d 100644
--- a/kernel/trace/trace_functions.c
+++ b/kernel/trace/trace_functions.c
@@ -29,14 +29,14 @@ static void function_reset(struct trace_array *tr)
29static void start_function_trace(struct trace_array *tr) 29static void start_function_trace(struct trace_array *tr)
30{ 30{
31 function_reset(tr); 31 function_reset(tr);
32 atomic_inc(&trace_record_cmdline_enabled); 32 tracing_start_cmdline_record();
33 tracing_start_function_trace(); 33 tracing_start_function_trace();
34} 34}
35 35
36static void stop_function_trace(struct trace_array *tr) 36static void stop_function_trace(struct trace_array *tr)
37{ 37{
38 tracing_stop_function_trace(); 38 tracing_stop_function_trace();
39 atomic_dec(&trace_record_cmdline_enabled); 39 tracing_stop_cmdline_record();
40} 40}
41 41
42static void function_trace_init(struct trace_array *tr) 42static void function_trace_init(struct trace_array *tr)
diff --git a/kernel/trace/trace_sched_switch.c b/kernel/trace/trace_sched_switch.c
index 798ec0dc863c..c16935d3bc5c 100644
--- a/kernel/trace/trace_sched_switch.c
+++ b/kernel/trace/trace_sched_switch.c
@@ -29,6 +29,9 @@ sched_switch_func(void *private, void *__rq, struct task_struct *prev,
29 long disabled; 29 long disabled;
30 int cpu; 30 int cpu;
31 31
32 tracing_record_cmdline(prev);
33 tracing_record_cmdline(next);
34
32 if (!tracer_enabled) 35 if (!tracer_enabled)
33 return; 36 return;
34 37
@@ -63,8 +66,6 @@ sched_switch_callback(void *probe_data, void *call_data,
63 prev = va_arg(*args, typeof(prev)); 66 prev = va_arg(*args, typeof(prev));
64 next = va_arg(*args, typeof(next)); 67 next = va_arg(*args, typeof(next));
65 68
66 tracing_record_cmdline(prev);
67
68 /* 69 /*
69 * If tracer_switch_func only points to the local 70 * If tracer_switch_func only points to the local
70 * switch func, it still needs the ptr passed to it. 71 * switch func, it still needs the ptr passed to it.
@@ -213,18 +214,26 @@ void tracing_stop_sched_switch(void)
213 tracing_sched_unregister(); 214 tracing_sched_unregister();
214} 215}
215 216
217void tracing_start_cmdline_record(void)
218{
219 tracing_start_sched_switch();
220}
221
222void tracing_stop_cmdline_record(void)
223{
224 tracing_stop_sched_switch();
225}
226
216static void start_sched_trace(struct trace_array *tr) 227static void start_sched_trace(struct trace_array *tr)
217{ 228{
218 sched_switch_reset(tr); 229 sched_switch_reset(tr);
219 atomic_inc(&trace_record_cmdline_enabled);
220 tracer_enabled = 1; 230 tracer_enabled = 1;
221 tracing_start_sched_switch(); 231 tracing_start_cmdline_record();
222} 232}
223 233
224static void stop_sched_trace(struct trace_array *tr) 234static void stop_sched_trace(struct trace_array *tr)
225{ 235{
226 tracing_stop_sched_switch(); 236 tracing_stop_cmdline_record();
227 atomic_dec(&trace_record_cmdline_enabled);
228 tracer_enabled = 0; 237 tracer_enabled = 0;
229} 238}
230 239