summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-09-04 20:02:35 +0400
committerSteven Rostedt <rostedt@goodmis.org>2009-09-04 20:02:35 +0400
commit621968cdb2563b667d6ecb484ba91ef4c3a797b3 (patch)
treea4b8e3ba1f55d6b725b37a4e42c2f376d6150cdc
parentb8de7bd168fa54d059b16d3057b2f8a32cc5bdc3 (diff)
downloadlinux-621968cdb2563b667d6ecb484ba91ef4c3a797b3.tar.xz
tracing: disable buffers and synchronize_sched before resetting
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>
-rw-r--r--kernel/trace/trace.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index e521f1e8f2bb..9110329ecf77 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -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)