Messages in this thread Patch in this message | | | Date | Fri, 04 Sep 2009 19:55:40 -0400 | From | Steven Rostedt <> | Subject | [PATCH 13/18] tracing: make tracing_reset safe for external use |
| |
From: Steven Rostedt <srostedt@redhat.com>
Reseting the trace buffer without first disabling the buffer and waiting for any writers to complete, can corrupt the ring buffer.
This patch makes the external version of tracing_reset safe from corruption by disabling the ring buffer and calling synchronize_sched.
This version can no longer be called from interrupt context. But all those callers have been removed.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org> --- kernel/trace/trace.c | 17 +++++++++++++++-- 1 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 7daf372..0418e26 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -641,13 +641,26 @@ void unregister_tracer(struct tracer *type) mutex_unlock(&trace_types_lock); } -void tracing_reset(struct trace_array *tr, int cpu) +static void __tracing_reset(struct trace_array *tr, int cpu) { ftrace_disable_cpu(); ring_buffer_reset_cpu(tr->buffer, cpu); ftrace_enable_cpu(); } +void tracing_reset(struct trace_array *tr, int cpu) +{ + struct ring_buffer *buffer = tr->buffer; + + ring_buffer_record_disable(buffer); + + /* Make sure all commits have finished */ + synchronize_sched(); + __tracing_reset(tr, cpu); + + ring_buffer_record_enable(buffer); +} + void tracing_reset_online_cpus(struct trace_array *tr) { struct ring_buffer *buffer = tr->buffer; @@ -661,7 +674,7 @@ void tracing_reset_online_cpus(struct trace_array *tr) tr->time_start = ftrace_now(tr->cpu); for_each_online_cpu(cpu) - tracing_reset(tr, cpu); + __tracing_reset(tr, cpu); ring_buffer_record_enable(buffer); } -- 1.6.3.3 --
| |