[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAPHJ_VK1t=pRw9zct9CNRET1=uH-efB9grAJ-kGJEN=PDk7z0w@mail.gmail.com>
Date: Thu, 5 Feb 2026 18:42:05 +0800
From: Zw Tang <shicenci@...il.com>
To: "linux-perf-users@...r.kernel.org" <linux-perf-users@...r.kernel.org>, mingo@...hat.com
Cc: boqun.feng@...il.com,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>, namhyung@...nel.org, will@...nel.org,
"peterz@...radead.org" <peterz@...radead.org>, juri.lelli@...hat.com
Subject: [BUG] PREEMPT_RT: sleeping function called from invalid context in perf_event_wakeup()
Hi,
I am reporting a PREEMPT_RT “sleeping function called from invalid
context” bug triggered by a syzkaller reproducer on Linux 6.19.0-rc7.
The kernel reports:
BUG: sleeping function called from invalid context at
kernel/locking/spinlock_rt.c:48
in_atomic(): 1, irqs_disabled(): 1, preempt_count: 4
The splat points to perf’s wakeup path taking an RT spinlock while
running in an atomic/IRQs-disabled context:
merge_sched_in()
-> perf_event_wakeup()
-> __wake_up_common_lock()
-> rt_spin_lock()
-> __might_resched() (complains about sleeping in invalid context)
This suggests a locking semantic mismatch on PREEMPT_RT:
perf_event_wakeup() (via __wake_up_common_lock()) ends up taking a
lock that maps to rt_spin_lock(), which may sleep on RT kernels, but
the current context is explicitly atomic with IRQs disabled.
Reproducer:
C reproducer: https://pastebin.com/raw/NwDSxaU3
console output: https://pastebin.com/raw/yEEzYbx5
kernel config: https://pastebin.com/raw/LwALTGZ5
Kernel:
git tree: torvalds/linux
HEAD commit: 63804fed149a6750ffd28610c5c1c98cce6bd377
kernel version: 6.19.0-rc7 #1 PREEMPT_{RT,(full)} (QEMU Ubuntu 24.10)
audit: type=1326 audit(2000000014.110:19630): auid=0 uid=0 gid=0 ses=3
pid=90430 comm="syz.5.11565" exe="/syz-executor" sig=31 arch=c000003e
syscall=202 compat=0 ip=0x7f95e6baebe9 code=0x0
netlink: 80 bytes leftover after parsing attributes in process `syz.6.11576'.
BUG: sleeping function called from invalid context at
kernel/locking/spinlock_rt.c:48
in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 90520, name: syz.2.11583
preempt_count: 4, expected: 0
RCU nest depth: 2, expected: 2
CPU: 0 UID: 0 PID: 90520 Comm: syz.2.11583 Not tainted 6.19.0-rc7 #1
PREEMPT_{RT,(full)}
Hardware name: QEMU Ubuntu 24.10 PC (i440FX + PIIX, 1996), BIOS
1.16.3-debian-1.16.3-2 04/01/2014
Call Trace:
<TASK>
__dump_stack lib/dump_stack.c:94 [inline]
dump_stack_lvl+0xab/0xe0 lib/dump_stack.c:120
__might_resched+0x2ae/0x430 kernel/sched/core.c:8829
__rt_spin_lock kernel/locking/spinlock_rt.c:48 [inline]
rt_spin_lock+0xc0/0x2c0 kernel/locking/spinlock_rt.c:57
spin_lock include/linux/spinlock_rt.h:44 [inline]
__wake_up_common_lock+0x1b/0x50 kernel/sched/wait.c:124
ring_buffer_wakeup kernel/events/core.c:6662 [inline]
perf_event_wakeup+0xde/0x230 kernel/events/core.c:7242
merge_sched_in+0x786/0x10c0 kernel/events/core.c:4020
visit_groups_merge.isra.0.constprop.0+0x889/0x10b0 kernel/events/core.c:3952
pmu_groups_sched_in kernel/events/core.c:4038 [inline]
__pmu_ctx_sched_in.isra.0+0x13f/0x180 kernel/events/core.c:4048
ctx_sched_in+0x2d9/0x840 kernel/events/core.c:4095
perf_event_sched_in+0x3d/0x90 kernel/events/core.c:2868
perf_event_context_sched_in kernel/events/core.c:4148 [inline]
__perf_event_task_sched_in+0x3ab/0x7e0 kernel/events/core.c:4177
perf_event_task_sched_in include/linux/perf_event.h:1631 [inline]
finish_task_switch+0x392/0x610 kernel/sched/core.c:5113
context_switch kernel/sched/core.c:5263 [inline]
__schedule+0x1293/0x38c0 kernel/sched/core.c:6867
__schedule_loop kernel/sched/core.c:6949 [inline]
schedule+0x66/0x180 kernel/sched/core.c:6964
futex_do_wait+0x88/0x180 kernel/futex/waitwake.c:358
__futex_wait+0x1af/0x2e0 kernel/futex/waitwake.c:687
futex_wait+0xdc/0x180 kernel/futex/waitwake.c:715
do_futex+0x2ec/0x360 kernel/futex/syscalls.c:130
__do_sys_futex kernel/futex/syscalls.c:207 [inline]
__se_sys_futex kernel/futex/syscalls.c:188 [inline]
__x64_sys_futex+0x1c9/0x480 kernel/futex/syscalls.c:188
do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
do_syscall_64+0xac/0x330 arch/x86/entry/syscall_64.c:94
entry_SYSCALL_64_after_hwframe+0x4b/0x53
RIP: 0033:0x7fa74e74ebe9
Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48
89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d
01 f0 ff ff 73 01 c3 48 c7 c1 a8 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007fa74d1b70e8 EFLAGS: 00000246 ORIG_RAX: 00000000000000ca
RAX: ffffffffffffffda RBX: 00007fa74e985fa8 RCX: 00007fa74e74ebe9
RDX: 0000000000000000 RSI: 0000000000000080 RDI: 00007fa74e985fa8
RBP: 00007fa74e985fa0 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
R13: 00007fa74e986038 R14: 00007fff7d0a70b0 R15: 00007fff7d0a7198
</TASK>
Powered by blists - more mailing lists