forked from Minki/linux
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.com Reported-by: Namhyung Kim <namhyung@gmail.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
parent
a6af8fbf17
commit
f0b70cc48c
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user