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);
 
 
 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)
        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)
 
 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);
 }
 
 }
 
 /**
- * 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;
 }
 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)