[PATCH] perf trace: Fix some leaks of struct thread

Namhyung Kim posted 1 patch 8 months, 3 weeks ago
There is a newer version of this series
tools/perf/builtin-trace.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
[PATCH] perf trace: Fix some leaks of struct thread
Posted by Namhyung Kim 8 months, 3 weeks ago
I've found some leaks from 'perf trace -a'.  It seems there are more
leaks but this is what I can find for now.

Cc: Howard Chu <howardchu95@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/builtin-trace.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 3d0c0076884d34cb..10cd99888a9a11b5 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -2835,7 +2835,7 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct evsel *evsel,
 	e_machine = thread__e_machine(thread, trace->host);
 	sc = trace__syscall_info(trace, evsel, e_machine, id);
 	if (sc == NULL)
-		return -1;
+		goto out_put;
 	ttrace = thread__trace(thread, trace);
 	/*
 	 * We need to get ttrace just to make sure it is there when syscall__scnprintf_args()
@@ -4123,8 +4123,10 @@ static int trace__set_filter_loop_pids(struct trace *trace)
 			pids[nr++] = thread__tid(parent);
 			break;
 		}
+		thread__put(thread);
 		thread = parent;
 	}
+	thread__put(thread);
 
 	err = evlist__append_tp_filter_pids(trace->evlist, nr, pids);
 	if (!err && trace->filter_pids.map)
-- 
2.49.0.472.ge94155a9ec-goog
Re: [PATCH] perf trace: Fix some leaks of struct thread
Posted by Howard Chu 8 months, 3 weeks ago
Hello Namhyung,

On Mon, Mar 31, 2025 at 11:46 AM Namhyung Kim <namhyung@kernel.org> wrote:
>
> I've found some leaks from 'perf trace -a'.  It seems there are more
> leaks but this is what I can find for now.
>
> Cc: Howard Chu <howardchu95@gmail.com>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/perf/builtin-trace.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> index 3d0c0076884d34cb..10cd99888a9a11b5 100644
> --- a/tools/perf/builtin-trace.c
> +++ b/tools/perf/builtin-trace.c
> @@ -2835,7 +2835,7 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct evsel *evsel,
>         e_machine = thread__e_machine(thread, trace->host);
>         sc = trace__syscall_info(trace, evsel, e_machine, id);
>         if (sc == NULL)
> -               return -1;
> +               goto out_put;
>         ttrace = thread__trace(thread, trace);
>         /*
>          * We need to get ttrace just to make sure it is there when syscall__scnprintf_args()
> @@ -4123,8 +4123,10 @@ static int trace__set_filter_loop_pids(struct trace *trace)
>                         pids[nr++] = thread__tid(parent);

I suggest adding a:
thread_put(parent);
here, just before the break.

>                         break;
>                 }
> +               thread__put(thread);
>                 thread = parent;
>         }
> +       thread__put(thread);
>
>         err = evlist__append_tp_filter_pids(trace->evlist, nr, pids);
>         if (!err && trace->filter_pids.map)
> --
> 2.49.0.472.ge94155a9ec-goog
>

Thanks,
Howard
Re: [PATCH] perf trace: Fix some leaks of struct thread
Posted by Namhyung Kim 8 months, 2 weeks ago
Hello Howard,

On Tue, Apr 01, 2025 at 06:07:15PM -0700, Howard Chu wrote:
> Hello Namhyung,
> 
> On Mon, Mar 31, 2025 at 11:46 AM Namhyung Kim <namhyung@kernel.org> wrote:
> >
> > I've found some leaks from 'perf trace -a'.  It seems there are more
> > leaks but this is what I can find for now.
> >
> > Cc: Howard Chu <howardchu95@gmail.com>
> > Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> > ---
> >  tools/perf/builtin-trace.c | 4 +++-
> >  1 file changed, 3 insertions(+), 1 deletion(-)
> >
> > diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> > index 3d0c0076884d34cb..10cd99888a9a11b5 100644
> > --- a/tools/perf/builtin-trace.c
> > +++ b/tools/perf/builtin-trace.c
> > @@ -2835,7 +2835,7 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct evsel *evsel,
> >         e_machine = thread__e_machine(thread, trace->host);
> >         sc = trace__syscall_info(trace, evsel, e_machine, id);
> >         if (sc == NULL)
> > -               return -1;
> > +               goto out_put;
> >         ttrace = thread__trace(thread, trace);
> >         /*
> >          * We need to get ttrace just to make sure it is there when syscall__scnprintf_args()
> > @@ -4123,8 +4123,10 @@ static int trace__set_filter_loop_pids(struct trace *trace)
> >                         pids[nr++] = thread__tid(parent);
> 
> I suggest adding a:
> thread_put(parent);
> here, just before the break.

You're right, will add it.

Thanks,
Namhyung

> 
> >                         break;
> >                 }
> > +               thread__put(thread);
> >                 thread = parent;
> >         }
> > +       thread__put(thread);
> >
> >         err = evlist__append_tp_filter_pids(trace->evlist, nr, pids);
> >         if (!err && trace->filter_pids.map)
> > --
> > 2.49.0.472.ge94155a9ec-goog
> >
> 
> Thanks,
> Howard
Re: [PATCH] perf trace: Fix some leaks of struct thread
Posted by Ian Rogers 8 months, 3 weeks ago
On Mon, Mar 31, 2025 at 11:46 AM Namhyung Kim <namhyung@kernel.org> wrote:
>
> I've found some leaks from 'perf trace -a'.  It seems there are more
> leaks but this is what I can find for now.
>
> Cc: Howard Chu <howardchu95@gmail.com>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>

Tested-by: Ian Rogers <irogers@google.com>

Thanks,
Ian

> ---
>  tools/perf/builtin-trace.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> index 3d0c0076884d34cb..10cd99888a9a11b5 100644
> --- a/tools/perf/builtin-trace.c
> +++ b/tools/perf/builtin-trace.c
> @@ -2835,7 +2835,7 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct evsel *evsel,
>         e_machine = thread__e_machine(thread, trace->host);
>         sc = trace__syscall_info(trace, evsel, e_machine, id);
>         if (sc == NULL)
> -               return -1;
> +               goto out_put;
>         ttrace = thread__trace(thread, trace);
>         /*
>          * We need to get ttrace just to make sure it is there when syscall__scnprintf_args()
> @@ -4123,8 +4123,10 @@ static int trace__set_filter_loop_pids(struct trace *trace)
>                         pids[nr++] = thread__tid(parent);
>                         break;
>                 }
> +               thread__put(thread);
>                 thread = parent;
>         }
> +       thread__put(thread);
>
>         err = evlist__append_tp_filter_pids(trace->evlist, nr, pids);
>         if (!err && trace->filter_pids.map)
> --
> 2.49.0.472.ge94155a9ec-goog
>