Skip to content

Commit 5611530

Browse files
Peter ZijlstraSasha Levin
authored andcommitted
perf: Ensure bpf_perf_link path is properly serialized
[ Upstream commit 7ed9138 ] Ravi reported that the bpf_perf_link_attach() usage of perf_event_set_bpf_prog() is not serialized by ctx->mutex, unlike the PERF_EVENT_IOC_SET_BPF case. Reported-by: Ravi Bangoria <ravi.bangoria@amd.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Ravi Bangoria <ravi.bangoria@amd.com> Link: https://lkml.kernel.org/r/20250307193305.486326750@infradead.org Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 71b0867 commit 5611530

File tree

1 file changed

+30
-4
lines changed

1 file changed

+30
-4
lines changed

kernel/events/core.c

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6239,6 +6239,9 @@ static int perf_event_set_output(struct perf_event *event,
62396239
static int perf_event_set_filter(struct perf_event *event, void __user *arg);
62406240
static int perf_copy_attr(struct perf_event_attr __user *uattr,
62416241
struct perf_event_attr *attr);
6242+
static int __perf_event_set_bpf_prog(struct perf_event *event,
6243+
struct bpf_prog *prog,
6244+
u64 bpf_cookie);
62426245

62436246
static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned long arg)
62446247
{
@@ -6301,7 +6304,7 @@ static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned lon
63016304
if (IS_ERR(prog))
63026305
return PTR_ERR(prog);
63036306

6304-
err = perf_event_set_bpf_prog(event, prog, 0);
6307+
err = __perf_event_set_bpf_prog(event, prog, 0);
63056308
if (err) {
63066309
bpf_prog_put(prog);
63076310
return err;
@@ -11069,8 +11072,9 @@ static inline bool perf_event_is_tracing(struct perf_event *event)
1106911072
return false;
1107011073
}
1107111074

11072-
int perf_event_set_bpf_prog(struct perf_event *event, struct bpf_prog *prog,
11073-
u64 bpf_cookie)
11075+
static int __perf_event_set_bpf_prog(struct perf_event *event,
11076+
struct bpf_prog *prog,
11077+
u64 bpf_cookie)
1107411078
{
1107511079
bool is_kprobe, is_uprobe, is_tracepoint, is_syscall_tp;
1107611080

@@ -11108,6 +11112,20 @@ int perf_event_set_bpf_prog(struct perf_event *event, struct bpf_prog *prog,
1110811112
return perf_event_attach_bpf_prog(event, prog, bpf_cookie);
1110911113
}
1111011114

11115+
int perf_event_set_bpf_prog(struct perf_event *event,
11116+
struct bpf_prog *prog,
11117+
u64 bpf_cookie)
11118+
{
11119+
struct perf_event_context *ctx;
11120+
int ret;
11121+
11122+
ctx = perf_event_ctx_lock(event);
11123+
ret = __perf_event_set_bpf_prog(event, prog, bpf_cookie);
11124+
perf_event_ctx_unlock(event, ctx);
11125+
11126+
return ret;
11127+
}
11128+
1111111129
void perf_event_free_bpf_prog(struct perf_event *event)
1111211130
{
1111311131
if (!event->prog)
@@ -11130,7 +11148,15 @@ static void perf_event_free_filter(struct perf_event *event)
1113011148
{
1113111149
}
1113211150

11133-
int perf_event_set_bpf_prog(struct perf_event *event, struct bpf_prog *prog,
11151+
static int __perf_event_set_bpf_prog(struct perf_event *event,
11152+
struct bpf_prog *prog,
11153+
u64 bpf_cookie)
11154+
{
11155+
return -ENOENT;
11156+
}
11157+
11158+
int perf_event_set_bpf_prog(struct perf_event *event,
11159+
struct bpf_prog *prog,
1113411160
u64 bpf_cookie)
1113511161
{
1113611162
return -ENOENT;

0 commit comments

Comments
 (0)