From: sashiko-bot@kernel.org
To: "Deepanshu Kartikey" <kartikey406@gmail.com>
Cc: bpf@vger.kernel.org, linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v2] perf/bpf: Fix lockless access to parent_event->prog in perf_event_alloc()
Date: Tue, 25 Aug 2026 04:59:50 +0000 [thread overview]
Message-ID: <20260825045951.237741F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260825044507.15217-1-kartikey406@gmail.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [Critical] Missing RCU read lock around the lockless read and increment of `parent_event->prog` allows a Use-After-Free.
- [High] The BPF program reference is leaked on error paths of `perf_event_alloc()`.
--
--- Patch [1]: [PATCH v2] perf/bpf: Fix lockless access to parent_event->prog in perf_event_alloc() ---
commit 14870f355d1ed182bbc1e31accf43918dde6051a
Author: Deepanshu Kartikey <kartikey406@gmail.com>
perf/bpf: Fix lockless access to parent_event->prog in perf_event_alloc()
This commit attempts to fix a race condition during fork() where
perf_event_alloc() locklessly reads parent_event->prog. It updates the code
to use READ_ONCE() and bpf_prog_inc_not_zero() to safely increment the
reference count without locks.
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index a6c8e38a31104..9d456b03c4969 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -13465,11 +13465,13 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu,
> overflow_handler = parent_event->overflow_handler;
> context = parent_event->overflow_handler_context;
> #if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_EVENT_TRACING)
> - if (parent_event->prog) {
> - struct bpf_prog *prog = parent_event->prog;
>
> - bpf_prog_inc(prog);
> - event->prog = prog;
> + struct bpf_prog *prog;
>
> + prog = READ_ONCE(parent_event->prog);
> + if (prog) {
> + prog = bpf_prog_inc_not_zero(prog);
[Severity: Critical]
This isn't a bug introduced by this patch, but since it aims to fix a race
here, does this code still leave a use-after-free window?
Because perf_event_alloc() executes in a sleepable context, the RCU grace
period could expire between reading parent_event->prog and calling
bpf_prog_inc_not_zero().
If a concurrent thread detaches the BPF program by closing the bpf_link fd,
it can locklessly release the program before the atomic increment happens.
Should this section be protected by an rcu_read_lock() and rcu_read_unlock()
block to ensure the memory isn't freed before the atomic increment
completes?
> + if (!IS_ERR(prog))
> + event->prog = prog;
[Severity: High]
This is a pre-existing issue, but does this increment leak the BPF program
reference if perf_event_alloc() fails later on?
If a subsequent initialization step like attach_perf_ctx_data() or
perf_cgroup_connect() fails, perf_event_alloc() returns an error pointer
and triggers the cleanup via __free_event().
Unlike _free_event() which calls perf_event_free_bpf_prog(), the
__free_event() error cleanup path doesn't appear to release the acquired
bpf_prog reference.
Could an unprivileged user systematically exhaust memory by forcing failures
during fork() on an inherited perf event?
> }
> #endif
> }
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260825044507.15217-1-kartikey406@gmail.com?part=1
next prev parent reply other threads:[~2026-08-25 4:59 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-25 4:45 [PATCH v2] perf/bpf: Fix lockless access to parent_event->prog in perf_event_alloc() Deepanshu Kartikey
2026-08-25 4:59 ` sashiko-bot [this message]
2026-08-30 6:24 ` Deepanshu Kartikey
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=20260825045951.237741F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=kartikey406@gmail.com \
--cc=linux-perf-users@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/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.