]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tracing: Fix resource leak on mmiotrace trace_pipe close
authordeepakraog <gaikwad.dcg@gmail.com>
Wed, 15 Jul 2026 14:36:04 +0000 (20:06 +0530)
committerSteven Rostedt <rostedt@goodmis.org>
Thu, 23 Jul 2026 16:30:07 +0000 (12:30 -0400)
The mmiotrace tracer was added May 12th 2008. At that time, resources
created in pipe_open() could not be freed because there was not
pipe_close function pointer of the tracer. The pipe_close function pointer
was added in December 7th, 2009, but the mmiotrace tracer was not updated.

mmio_pipe_open() allocates a header_iter and takes a pci_dev reference
when trace_pipe is opened. mmio_close() frees them, but it was only
wired to the tracer's .close callback.

tracing_release_pipe() invokes .pipe_close, not .close, when the
trace_pipe file is released. As a result, closing trace_pipe with the
mmiotrace tracer active leaked the header_iter allocation and left a
stale pci_dev reference.

Set .pipe_close to mmio_close, matching how function_graph wires both
callbacks to the same handler.

Note, if the trace_pipe is read to completion, it will clean up the
resources, but if one were to run:

  # head -n 1 /sys/kernel/tracing/trace_pipe
 VERSION 20070824

Over and over again, it would trigger a massive leak.

Cc: stable@vger.kernel.org
Fixes: c521efd1700a8 ("tracing: Add pipe_close interface)
Link: https://patch.msgid.link/20260715143604.14481-1-gaikwad.dcg@gmail.com
Signed-off-by: deepakraog <gaikwad.dcg@gmail.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/trace_mmiotrace.c

index 226cf66e0d68d897e8b20f9fb8e944306536ffa8..20812e7f911f1d2f111b919dda63ae2d55e0e62d 100644 (file)
@@ -109,7 +109,6 @@ static void mmio_pipe_open(struct trace_iterator *iter)
        iter->private = hiter;
 }
 
-/* XXX: This is not called when the pipe is closed! */
 static void mmio_close(struct trace_iterator *iter)
 {
        struct header_iter *hiter = iter->private;
@@ -279,6 +278,7 @@ static struct tracer mmio_tracer __read_mostly =
        .start          = mmio_trace_start,
        .pipe_open      = mmio_pipe_open,
        .close          = mmio_close,
+       .pipe_close     = mmio_close,
        .read           = mmio_read,
        .print_line     = mmio_print_line,
        .noboot         = true,