aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>2014-01-14 08:43:01 -0500
committerSteven Rostedt <rostedt@goodmis.org>2014-02-20 12:13:16 -0500
commit6b450d2533e2c1c71fbe7f1bdce0bb1c9f813030 (patch)
tree6e9d9390e712becb76ec8892fd6a6421ec345cca /kernel
parente6435e96ec6f31a05690876a19e63e451f7b37e2 (diff)
tracing: Disable tracers before deletion of instance
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>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/trace/trace.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index da9543cdbe7a..7d5913bb46e8 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -3907,6 +3907,23 @@ create_trace_option_files(struct trace_array *tr, struct tracer *tracer);
3907static void 3907static void
3908destroy_trace_option_files(struct trace_option_dentry *topts); 3908destroy_trace_option_files(struct trace_option_dentry *topts);
3909 3909
3910/*
3911 * Used to clear out the tracer before deletion of an instance.
3912 * Must have trace_types_lock held.
3913 */
3914static void tracing_set_nop(struct trace_array *tr)
3915{
3916 if (tr->current_trace == &nop_trace)
3917 return;
3918
3919 tr->current_trace->enabled = false;
3920
3921 if (tr->current_trace->reset)
3922 tr->current_trace->reset(tr);
3923
3924 tr->current_trace = &nop_trace;
3925}
3926
3910static int tracing_set_tracer(struct trace_array *tr, const char *buf) 3927static int tracing_set_tracer(struct trace_array *tr, const char *buf)
3911{ 3928{
3912 static struct trace_option_dentry *topts; 3929 static struct trace_option_dentry *topts;
@@ -6142,6 +6159,7 @@ static int instance_delete(const char *name)
6142 6159
6143 list_del(&tr->list); 6160 list_del(&tr->list);
6144 6161
6162 tracing_set_nop(tr);
6145 event_trace_del_tracer(tr); 6163 event_trace_del_tracer(tr);
6146 debugfs_remove_recursive(tr->dir); 6164 debugfs_remove_recursive(tr->dir);
6147 free_percpu(tr->trace_buffer.data); 6165 free_percpu(tr->trace_buffer.data);