aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace.c
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-09-04 12:35:16 -0400
committerSteven Rostedt <rostedt@goodmis.org>2009-09-04 18:46:51 -0400
commitf633903af2ceb0cec07d45e499a072b6593d0ed1 (patch)
tree9a484fa299142a00d0dbb5a97e1108031db96e70 /kernel/trace/trace.c
parent2f26ebd549b9ab55ac756b836ec759c11fe93f81 (diff)
tracing: make tracing_reset safe for external use
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>
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r--kernel/trace/trace.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 7daf372e319a..0418e2650d41 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -641,13 +641,26 @@ void unregister_tracer(struct tracer *type)
641 mutex_unlock(&trace_types_lock); 641 mutex_unlock(&trace_types_lock);
642} 642}
643 643
644void tracing_reset(struct trace_array *tr, int cpu) 644static void __tracing_reset(struct trace_array *tr, int cpu)
645{ 645{
646 ftrace_disable_cpu(); 646 ftrace_disable_cpu();
647 ring_buffer_reset_cpu(tr->buffer, cpu); 647 ring_buffer_reset_cpu(tr->buffer, cpu);
648 ftrace_enable_cpu(); 648 ftrace_enable_cpu();
649} 649}
650 650
651void tracing_reset(struct trace_array *tr, int cpu)
652{
653 struct ring_buffer *buffer = tr->buffer;
654
655 ring_buffer_record_disable(buffer);
656
657 /* Make sure all commits have finished */
658 synchronize_sched();
659 __tracing_reset(tr, cpu);
660
661 ring_buffer_record_enable(buffer);
662}
663
651void tracing_reset_online_cpus(struct trace_array *tr) 664void tracing_reset_online_cpus(struct trace_array *tr)
652{ 665{
653 struct ring_buffer *buffer = tr->buffer; 666 struct ring_buffer *buffer = tr->buffer;
@@ -661,7 +674,7 @@ void tracing_reset_online_cpus(struct trace_array *tr)
661 tr->time_start = ftrace_now(tr->cpu); 674 tr->time_start = ftrace_now(tr->cpu);
662 675
663 for_each_online_cpu(cpu) 676 for_each_online_cpu(cpu)
664 tracing_reset(tr, cpu); 677 __tracing_reset(tr, cpu);
665 678
666 ring_buffer_record_enable(buffer); 679 ring_buffer_record_enable(buffer);
667} 680}