aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/trace/trace.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index e29edee1542a..26cfff38e2ab 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -6232,6 +6232,25 @@ static int allocate_trace_buffers(struct trace_array *tr, int size)
6232 return 0; 6232 return 0;
6233} 6233}
6234 6234
6235static void free_trace_buffers(struct trace_array *tr)
6236{
6237 if (!tr)
6238 return;
6239
6240 if (tr->trace_buffer.buffer) {
6241 ring_buffer_free(tr->trace_buffer.buffer);
6242 tr->trace_buffer.buffer = NULL;
6243 free_percpu(tr->trace_buffer.data);
6244 }
6245
6246#ifdef CONFIG_TRACER_MAX_TRACE
6247 if (tr->max_buffer.buffer) {
6248 ring_buffer_free(tr->max_buffer.buffer);
6249 tr->max_buffer.buffer = NULL;
6250 }
6251#endif
6252}
6253
6235static int new_instance_create(const char *name) 6254static int new_instance_create(const char *name)
6236{ 6255{
6237 struct trace_array *tr; 6256 struct trace_array *tr;
@@ -6290,8 +6309,7 @@ static int new_instance_create(const char *name)
6290 return 0; 6309 return 0;
6291 6310
6292 out_free_tr: 6311 out_free_tr:
6293 if (tr->trace_buffer.buffer) 6312 free_trace_buffers(tr);
6294 ring_buffer_free(tr->trace_buffer.buffer);
6295 free_cpumask_var(tr->tracing_cpumask); 6313 free_cpumask_var(tr->tracing_cpumask);
6296 kfree(tr->name); 6314 kfree(tr->name);
6297 kfree(tr); 6315 kfree(tr);