提交 f0b70cc4 编写于 作者: S Steven Rostedt (Red Hat) 提交者: Steven Rostedt

tracing: Fix leak of per cpu max data in instances

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.comReported-by: NNamhyung Kim <namhyung@gmail.com>
Signed-off-by: NSteven Rostedt <rostedt@goodmis.org>
上级 a6af8fbf
...@@ -6242,22 +6242,25 @@ static int allocate_trace_buffers(struct trace_array *tr, int size) ...@@ -6242,22 +6242,25 @@ static int allocate_trace_buffers(struct trace_array *tr, int size)
return 0; 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) static void free_trace_buffers(struct trace_array *tr)
{ {
if (!tr) if (!tr)
return; return;
if (tr->trace_buffer.buffer) { free_trace_buffer(&tr->trace_buffer);
ring_buffer_free(tr->trace_buffer.buffer);
tr->trace_buffer.buffer = NULL;
free_percpu(tr->trace_buffer.data);
}
#ifdef CONFIG_TRACER_MAX_TRACE #ifdef CONFIG_TRACER_MAX_TRACE
if (tr->max_buffer.buffer) { free_trace_buffer(&tr->max_buffer);
ring_buffer_free(tr->max_buffer.buffer);
tr->max_buffer.buffer = NULL;
}
#endif #endif
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册