tracing: Disable tracers before deletion of instance
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>
Tue, 14 Jan 2014 13:43:01 +0000 (08:43 -0500)
committerSteven Rostedt <rostedt@goodmis.org>
Thu, 20 Feb 2014 17:13:16 +0000 (12:13 -0500)
When an instance is about to be deleted, make sure the tracer
is set to nop. If it isn't reset the tracer and set it to the nop
tracer, otherwise memory leaks and bad pointers may result.

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

index da9543cdbe7a139daf331dad34651467f0bb4724..7d5913bb46e86fc64fea7b2377bfe7997a887500 100644 (file)
@@ -3907,6 +3907,23 @@ create_trace_option_files(struct trace_array *tr, struct tracer *tracer);
 static void
 destroy_trace_option_files(struct trace_option_dentry *topts);
 
+/*
+ * Used to clear out the tracer before deletion of an instance.
+ * Must have trace_types_lock held.
+ */
+static void tracing_set_nop(struct trace_array *tr)
+{
+       if (tr->current_trace == &nop_trace)
+               return;
+       
+       tr->current_trace->enabled = false;
+
+       if (tr->current_trace->reset)
+               tr->current_trace->reset(tr);
+
+       tr->current_trace = &nop_trace;
+}
+
 static int tracing_set_tracer(struct trace_array *tr, const char *buf)
 {
        static struct trace_option_dentry *topts;
@@ -6142,6 +6159,7 @@ static int instance_delete(const char *name)
 
        list_del(&tr->list);
 
+       tracing_set_nop(tr);
        event_trace_del_tracer(tr);
        debugfs_remove_recursive(tr->dir);
        free_percpu(tr->trace_buffer.data);