[<prev] [next>] [day] [month] [year] [list]
Message-Id: <20260127023618.1469937-1-zeri@umich.edu>
Date: Mon, 26 Jan 2026 21:36:18 -0500
From: Henry Zhang <henryzhangjcle@...il.com>
To: peterz@...radead.org,
mingo@...hat.com
Cc: acme@...nel.org,
linux-perf-users@...r.kernel.org,
linux-kernel@...r.kernel.org,
syzkaller-bugs@...glegroups.com,
Henry Zhang <zeri@...ch.edu>,
syzbot+2a077cb788749964cf68@...kaller.appspotmail.com
Subject: [PATCH] perf: Fix data race in perf_event_set_bpf_handler()
KCSAN reported a data race where perf_event_set_bpf_handler() writes
event->prog while __perf_event_overflow() reads it concurrently from
interrupt context:
BUG: KCSAN: data-race in __perf_event_overflow / __perf_event_set_bpf_prog
write to 0xffff88811b219168 of 8 bytes by task 13065 on cpu 0:
perf_event_set_bpf_handler kernel/events/core.c:10352 [inline]
__perf_event_set_bpf_prog+0x418/0x470 kernel/events/core.c:11303
...
read to 0xffff88811b219168 of 8 bytes by interrupt on cpu 1:
__perf_event_overflow+0x252/0x920 kernel/events/core.c:10410
...
Annotate event->prog access with WRITE_ONCE/READ_ONCE.
Reported-by: syzbot+2a077cb788749964cf68@...kaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=2a077cb788749964cf68
Signed-off-by: Henry Zhang <zeri@...ch.edu>
---
kernel/events/core.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index a0fa488bce84..1f3ed9e87507 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -10349,7 +10349,7 @@ static inline int perf_event_set_bpf_handler(struct perf_event *event,
return -EPROTO;
}
- event->prog = prog;
+ WRITE_ONCE(event->prog, prog);
event->bpf_cookie = bpf_cookie;
return 0;
}
@@ -10407,7 +10407,9 @@ static int __perf_event_overflow(struct perf_event *event,
if (event->attr.aux_pause)
perf_event_aux_pause(event->aux_event, true);
- if (event->prog && event->prog->type == BPF_PROG_TYPE_PERF_EVENT &&
+ struct bpf_prog *prog = READ_ONCE(event->prog);
+
+ if (prog && prog->type == BPF_PROG_TYPE_PERF_EVENT &&
!bpf_overflow_handler(event, data, regs))
goto out;
--
2.34.1
Powered by blists - more mailing lists