tracing: disable buffers and synchronize_sched before resetting
authorSteven Rostedt <srostedt@redhat.com>
Fri, 4 Sep 2009 16:02:35 +0000 (12:02 -0400)
committerSteven Rostedt <rostedt@goodmis.org>
Fri, 4 Sep 2009 16:02:35 +0000 (12:02 -0400)
Resetting the ring buffers while traces are happening can corrupt
the ring buffer and disable it (no kernel crash to worry about).

The safest thing to do is disable the ring buffers, call synchronize_sched()
to wait for all current writers to finish and then reset the buffer.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/trace.c

index e521f1e8f2bb7571fc40afa0ce080053fcf68044..9110329ecf77e1d9aaef8df86b266f9fc8b02895 100644 (file)
@@ -658,12 +658,20 @@ void tracing_reset(struct trace_array *tr, int cpu)
 
 void tracing_reset_online_cpus(struct trace_array *tr)
 {
+       struct ring_buffer *buffer = tr->buffer;
        int cpu;
 
+       ring_buffer_record_disable(buffer);
+
+       /* Make sure all commits have finished */
+       synchronize_sched();
+
        tr->time_start = ftrace_now(tr->cpu);
 
        for_each_online_cpu(cpu)
                tracing_reset(tr, cpu);
+
+       ring_buffer_record_enable(buffer);
 }
 
 void tracing_reset_current(int cpu)