tracing: Fix leak of per cpu max data in instances
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>
Tue, 10 Jun 2014 16:06:30 +0000 (12:06 -0400)
committerSteven Rostedt <rostedt@goodmis.org>
Tue, 10 Jun 2014 16:06:30 +0000 (12:06 -0400)
The freeing of an instance, if max data is configured, there will be
per cpu data structures created. But these are not freed when the instance
is deleted, which causes a memory leak.

A new helper function is added that frees the individual buffers within a
trace array, instead of duplicating the code. This way changes made for one
are applied to the other (normal buffer vs max buffer).

Link: http://lkml.kernel.org/r/87k38pbake.fsf@sejong.aot.lge.com
Reported-by: Namhyung Kim <namhyung@gmail.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/trace.c

index 2b458c6..384ede3 100644 (file)
@@ -6242,22 +6242,25 @@ static int allocate_trace_buffers(struct trace_array *tr, int size)
        return 0;
 }
 
+static void free_trace_buffer(struct trace_buffer *buf)
+{
+       if (buf->buffer) {
+               ring_buffer_free(buf->buffer);
+               buf->buffer = NULL;
+               free_percpu(buf->data);
+               buf->data = NULL;
+       }
+}
+
 static void free_trace_buffers(struct trace_array *tr)
 {
        if (!tr)
                return;
 
-       if (tr->trace_buffer.buffer) {
-               ring_buffer_free(tr->trace_buffer.buffer);
-               tr->trace_buffer.buffer = NULL;
-               free_percpu(tr->trace_buffer.data);
-       }
+       free_trace_buffer(&tr->trace_buffer);
 
 #ifdef CONFIG_TRACER_MAX_TRACE
-       if (tr->max_buffer.buffer) {
-               ring_buffer_free(tr->max_buffer.buffer);
-               tr->max_buffer.buffer = NULL;
-       }
+       free_trace_buffer(&tr->max_buffer);
 #endif
 }