From: Krister Johansen <kjlx@templeofstupid.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: LKML <linux-kernel@vger.kernel.org>, Jiri Olsa <jolsa@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Frederic Weisbecker <fweisbec@gmail.com>,
Ingo Molnar <mingo@kernel.org>, David Reaver <me@davidreaver.com>,
Masami Hiramatsu <mhiramat@kernel.org>,
Krister Johansen <kjlx@templeofstupid.com>
Subject: Re: [PATCH] tracing/perf: Fix double put of trace event when init fails
Date: Tue, 16 Aug 2022 21:46:56 -0700 [thread overview]
Message-ID: <20220817044656.GA1941@templeofstupid.com> (raw)
In-Reply-To: <20220816192817.43d5e17f@gandalf.local.home>
On Tue, Aug 16, 2022 at 07:28:17PM -0400, Steven Rostedt wrote:
> From: "Steven Rostedt (Google)" <rostedt@goodmis.org>
>
> If in perf_trace_event_init(), the perf_trace_event_open() fails, then it
> will call perf_trace_event_unreg() which will not only unregister the perf
> trace event, but will also call the put() function of the tp_event.
>
> The problem here is that the trace_event_try_get_ref() is called by the
> caller of perf_trace_event_init() and if perf_trace_event_init() returns a
> failure, it will then call trace_event_put(). But since the
> perf_trace_event_unreg() already called the trace_event_put() function, it
> triggers a WARN_ON().
>
> WARNING: CPU: 1 PID: 30309 at kernel/trace/trace_dynevent.c:46 trace_event_dyn_put_ref+0x15/0x20
>
> If perf_trace_event_reg() does not call the trace_event_try_get_ref() then
> the perf_trace_event_unreg() should not be calling trace_event_put(). This
> breaks symmetry and causes bugs like these.
>
> Pull out the trace_event_put() from perf_trace_event_unreg() and call it
> in the locations that perf_trace_event_unreg() is called. This not only
> fixes this bug, but also brings back the proper symmetry of the reg/unreg
> vs get/put logic.
>
> Link: https://lore.kernel.org/all/cover.1660347763.git.kjlx@templeofstupid.com/
>
> Reported-by: Krister Johansen <kjlx@templeofstupid.com>
> Reviewed-by: Krister Johansen <kjlx@templeofstupid.com>
> Tested-by: Krister Johansen <kjlx@templeofstupid.com>
> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Thanks again, Steven. Is this one that you would consider tagging for a
backport to stable at the appropriate time? I believe this one showed up
in 5.15, if it's any help.
-K
> ---
> kernel/trace/trace_event_perf.c | 7 ++++---
> 1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c
> index a114549720d6..61e3a2620fa3 100644
> --- a/kernel/trace/trace_event_perf.c
> +++ b/kernel/trace/trace_event_perf.c
> @@ -157,7 +157,7 @@ static void perf_trace_event_unreg(struct perf_event *p_event)
> int i;
>
> if (--tp_event->perf_refcount > 0)
> - goto out;
> + return;
>
> tp_event->class->reg(tp_event, TRACE_REG_PERF_UNREGISTER, NULL);
>
> @@ -176,8 +176,6 @@ static void perf_trace_event_unreg(struct perf_event *p_event)
> perf_trace_buf[i] = NULL;
> }
> }
> -out:
> - trace_event_put_ref(tp_event);
> }
>
> static int perf_trace_event_open(struct perf_event *p_event)
> @@ -241,6 +239,7 @@ void perf_trace_destroy(struct perf_event *p_event)
> mutex_lock(&event_mutex);
> perf_trace_event_close(p_event);
> perf_trace_event_unreg(p_event);
> + trace_event_put_ref(p_event->tp_event);
> mutex_unlock(&event_mutex);
> }
>
> @@ -292,6 +291,7 @@ void perf_kprobe_destroy(struct perf_event *p_event)
> mutex_lock(&event_mutex);
> perf_trace_event_close(p_event);
> perf_trace_event_unreg(p_event);
> + trace_event_put_ref(p_event->tp_event);
> mutex_unlock(&event_mutex);
>
> destroy_local_trace_kprobe(p_event->tp_event);
> @@ -347,6 +347,7 @@ void perf_uprobe_destroy(struct perf_event *p_event)
> mutex_lock(&event_mutex);
> perf_trace_event_close(p_event);
> perf_trace_event_unreg(p_event);
> + trace_event_put_ref(p_event->tp_event);
> mutex_unlock(&event_mutex);
> destroy_local_trace_uprobe(p_event->tp_event);
> }
> --
> 2.35.1
>
next prev parent reply other threads:[~2022-08-17 4:47 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-16 23:28 [PATCH] tracing/perf: Fix double put of trace event when init fails Steven Rostedt
2022-08-17 4:46 ` Krister Johansen [this message]
2022-08-17 14:03 ` Steven Rostedt
2022-08-17 9:16 ` Jiri Olsa
2022-08-17 14:01 ` Steven Rostedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220817044656.GA1941@templeofstupid.com \
--to=kjlx@templeofstupid.com \
--cc=fweisbec@gmail.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=me@davidreaver.com \
--cc=mhiramat@kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.