From: Weiming Shi <bestswngs@gmail.com>
To: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
James Clark <james.clark@linaro.org>
Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org,
Xiang Mei <xmei5@asu.edu>,
co+8a0b9fcf1e087762@bugs.sh
Subject: [PATCH] perf/core: Protect put_ctx() wakeup with RCU
Date: Tue, 6 Oct 2026 11:42:24 +0800 [thread overview]
Message-ID: <20261006034224.3014697-1-bestswngs@gmail.com> (raw)
put_ctx() drops a context reference before checking ctx->task in its
non-final branch. perf_event_open() can break an inherited context
relationship in find_get_context() while a concurrent close() drops the
context's final reference, allowing free_ctx() to run before the
post-decrement read. A reproducer triggers this on an unmodified KASAN
kernel:
BUG: KASAN: slab-use-after-free in put_ctx+0x213/0x220
Read of size 8 at addr ffff88801ef4b480 by task poc/5714
CPU: 2 UID: 65534 PID: 5714 Comm: poc
Call Trace:
...
put_ctx (kernel/events/core.c:1394)
find_get_context (kernel/events/core.c:5135)
__do_sys_perf_event_open (kernel/events/core.c:14083)
do_syscall_64 (arch/x86/entry/syscall_64.c:84)
...
entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
Hold an RCU read-side lock across the decrement and wakeup decision so
free_ctx() cannot reclaim the context until the access completes.
Fixes: 59f3aa4a3ee2 ("perf: Simplify perf_event_free_task() wait")
Reported-by: <co+8a0b9fcf1e087762@bugs.sh>
Assisted-by: LLM
Signed-off-by: Weiming Shi <bestswngs@gmail.com>
---
kernel/events/core.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index fe33fe1..2fec17a 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -1383,6 +1383,7 @@ static void free_ctx(struct rcu_head *head)
static void put_ctx(struct perf_event_context *ctx)
{
+ rcu_read_lock();
if (refcount_dec_and_test(&ctx->refcount)) {
if (ctx->parent_ctx)
put_ctx(ctx->parent_ctx);
@@ -1394,6 +1395,7 @@ static void put_ctx(struct perf_event_context *ctx)
if (ctx->task == TASK_TOMBSTONE)
wake_up_var(&ctx->refcount);
}
+ rcu_read_unlock();
}
/*
next reply other threads:[~2026-10-06 3:42 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-06 3:42 Weiming Shi [this message]
2026-10-06 3:49 ` [PATCH] perf/core: Protect put_ctx() wakeup with RCU sashiko-bot
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=20261006034224.3014697-1-bestswngs@gmail.com \
--to=bestswngs@gmail.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=co+8a0b9fcf1e087762@bugs.sh \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=xmei5@asu.edu \
/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.