aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/trace/trace.h4
-rw-r--r--kernel/trace/trace_boot.c6
-rw-r--r--kernel/trace/trace_sched_switch.c50
3 files changed, 46 insertions, 14 deletions
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index db12e16137e..25abfc45f08 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -324,7 +324,9 @@ void trace_function(struct trace_array *tr,
void tracing_start_cmdline_record(void);
void tracing_stop_cmdline_record(void);
-void tracing_cmdline_assign_trace(struct trace_array *tr);
+void tracing_sched_switch_assign_trace(struct trace_array *tr);
+void tracing_stop_sched_switch_record(void);
+void tracing_start_sched_switch_record(void);
int register_tracer(struct tracer *type);
void unregister_tracer(struct tracer *type);
diff --git a/kernel/trace/trace_boot.c b/kernel/trace/trace_boot.c
index 662cb919890..0203c105401 100644
--- a/kernel/trace/trace_boot.c
+++ b/kernel/trace/trace_boot.c
@@ -28,13 +28,13 @@ void start_boot_trace(void)
void enable_boot_trace(void)
{
if (pre_initcalls_finished)
- tracing_start_cmdline_record();
+ tracing_start_sched_switch_record();
}
void disable_boot_trace(void)
{
if (pre_initcalls_finished)
- tracing_stop_cmdline_record();
+ tracing_stop_sched_switch_record();
}
static void reset_boot_trace(struct trace_array *tr)
@@ -55,7 +55,7 @@ static void boot_trace_init(struct trace_array *tr)
for_each_cpu_mask(cpu, cpu_possible_map)
tracing_reset(tr, cpu);
- tracing_cmdline_assign_trace(tr);
+ tracing_sched_switch_assign_trace(tr);
}
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 fbf05df7134..79410db64d6 100644
--- a/kernel/trace/trace_sched_switch.c
+++ b/kernel/trace/trace_sched_switch.c
@@ -125,20 +125,16 @@ static void tracing_sched_unregister(void)
static void tracing_start_sched_switch(void)
{
mutex_lock(&sched_register_mutex);
- if (!(sched_ref++)) {
- tracer_enabled = 1;
+ if (!(sched_ref++))
tracing_sched_register();
- }
mutex_unlock(&sched_register_mutex);
}
static void tracing_stop_sched_switch(void)
{
mutex_lock(&sched_register_mutex);
- if (!(--sched_ref)) {
+ if (!(--sched_ref))
tracing_sched_unregister();
- tracer_enabled = 0;
- }
mutex_unlock(&sched_register_mutex);
}
@@ -153,14 +149,48 @@ void tracing_stop_cmdline_record(void)
}
/**
- * tracing_cmdline_assign_trace - assign a trace array for ctx switch
+ * tracing_start_sched_switch_record - start tracing context switches
+ *
+ * Turns on context switch tracing for a tracer.
+ */
+void tracing_start_sched_switch_record(void)
+{
+ if (unlikely(!ctx_trace)) {
+ WARN_ON(1);
+ return;
+ }
+
+ tracing_start_sched_switch();
+
+ mutex_lock(&sched_register_mutex);
+ tracer_enabled++;
+ mutex_unlock(&sched_register_mutex);
+}
+
+/**
+ * tracing_stop_sched_switch_record - start tracing context switches
+ *
+ * Turns off context switch tracing for a tracer.
+ */
+void tracing_stop_sched_switch_record(void)
+{
+ mutex_lock(&sched_register_mutex);
+ tracer_enabled--;
+ WARN_ON(tracer_enabled < 0);
+ mutex_unlock(&sched_register_mutex);
+
+ tracing_stop_sched_switch();
+}
+
+/**
+ * tracing_sched_switch_assign_trace - assign a trace array for ctx switch
* @tr: trace array pointer to assign
*
* Some tracers might want to record the context switches in their
* trace. This function lets those tracers assign the trace array
* to use.
*/
-void tracing_cmdline_assign_trace(struct trace_array *tr)
+void tracing_sched_switch_assign_trace(struct trace_array *tr)
{
ctx_trace = tr;
}
@@ -168,12 +198,12 @@ void tracing_cmdline_assign_trace(struct trace_array *tr)
static void start_sched_trace(struct trace_array *tr)
{
sched_switch_reset(tr);
- tracing_start_cmdline_record();
+ tracing_start_sched_switch_record();
}
static void stop_sched_trace(struct trace_array *tr)
{
- tracing_stop_cmdline_record();
+ tracing_stop_sched_switch_record();
}
static void sched_switch_trace_init(struct trace_array *tr)