mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [BUG] PREEMPT_RT: sleeping function called from invalid context in perf_event_wakeup()
@ 2026-02-05 10:42 Zw Tang
  2026-02-05 11:08 ` Peter Zijlstra
  0 siblings, 1 reply; 4+ messages in thread
From: Zw Tang @ 2026-02-05 10:42 UTC (permalink / raw)
  To: linux-perf-users, mingo
  Cc: boqun.feng, linux-kernel, namhyung, will, peterz, juri.lelli

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>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [BUG] PREEMPT_RT: sleeping function called from invalid context in perf_event_wakeup()
  2026-02-05 10:42 [BUG] PREEMPT_RT: sleeping function called from invalid context in perf_event_wakeup() Zw Tang
@ 2026-02-05 11:08 ` Peter Zijlstra
  2026-02-13 12:47   ` Mukesh Ojha
  0 siblings, 1 reply; 4+ messages in thread
From: Peter Zijlstra @ 2026-02-05 11:08 UTC (permalink / raw)
  To: Zw Tang
  Cc: linux-perf-users, mingo, boqun.feng, linux-kernel, namhyung,
	will, juri.lelli

On Thu, Feb 05, 2026 at 06:42:05PM +0800, Zw Tang wrote:
> 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.

Fixes: f4b07fd62d4d ("perf/core: Use POLLHUP for pinned events in error")

diff --git a/kernel/events/core.c b/kernel/events/core.c
index dad0d3d2e85f..216cf6ae1c7d 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -4017,7 +4017,8 @@ static int merge_sched_in(struct perf_event *event, void *data)
 			if (*perf_event_fasync(event))
 				event->pending_kill = POLL_ERR;
 
-			perf_event_wakeup(event);
+			event->pending_wakeup = 1;
+			irq_work_queue(&event->pending_irq);
 		} else {
 			struct perf_cpu_pmu_context *cpc = this_cpc(event->pmu_ctx->pmu);

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [BUG] PREEMPT_RT: sleeping function called from invalid context in perf_event_wakeup()
  2026-02-05 11:08 ` Peter Zijlstra
@ 2026-02-13 12:47   ` Mukesh Ojha
  2026-02-13 14:12     ` Peter Zijlstra
  0 siblings, 1 reply; 4+ messages in thread
From: Mukesh Ojha @ 2026-02-13 12:47 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Zw Tang, linux-perf-users, mingo, boqun.feng, linux-kernel,
	namhyung, will, juri.lelli

On Thu, Feb 05, 2026 at 12:08:55PM +0100, Peter Zijlstra wrote:
> On Thu, Feb 05, 2026 at 06:42:05PM +0800, Zw Tang wrote:
> > 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()
G> > -> 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.
> 
> Fixes: f4b07fd62d4d ("perf/core: Use POLLHUP for pinned events in error")
> 
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index dad0d3d2e85f..216cf6ae1c7d 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -4017,7 +4017,8 @@ static int merge_sched_in(struct perf_event *event, void *data)
>  			if (*perf_event_fasync(event))
>  				event->pending_kill = POLL_ERR;
>  
> -			perf_event_wakeup(event);
> +			event->pending_wakeup = 1;
> +			irq_work_queue(&event->pending_irq);
>  		} else {
>  			struct perf_cpu_pmu_context *cpc = this_cpc(event->pmu_ctx->pmu);


Looks like this https://lore.kernel.org/lkml/20250603045105.1731451-1-namhyung@kernel.org/
got unnoticed.

-- 
-Mukesh Ojha

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [BUG] PREEMPT_RT: sleeping function called from invalid context in perf_event_wakeup()
  2026-02-13 12:47   ` Mukesh Ojha
@ 2026-02-13 14:12     ` Peter Zijlstra
  0 siblings, 0 replies; 4+ messages in thread
From: Peter Zijlstra @ 2026-02-13 14:12 UTC (permalink / raw)
  To: Mukesh Ojha
  Cc: Zw Tang, linux-perf-users, mingo, boqun.feng, linux-kernel,
	namhyung, will, juri.lelli

On Fri, Feb 13, 2026 at 06:17:05PM +0530, Mukesh Ojha wrote:
> On Thu, Feb 05, 2026 at 12:08:55PM +0100, Peter Zijlstra wrote:
> > On Thu, Feb 05, 2026 at 06:42:05PM +0800, Zw Tang wrote:
> > > 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()
> G> > -> 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.
> > 
> > Fixes: f4b07fd62d4d ("perf/core: Use POLLHUP for pinned events in error")
> > 
> > diff --git a/kernel/events/core.c b/kernel/events/core.c
> > index dad0d3d2e85f..216cf6ae1c7d 100644
> > --- a/kernel/events/core.c
> > +++ b/kernel/events/core.c
> > @@ -4017,7 +4017,8 @@ static int merge_sched_in(struct perf_event *event, void *data)
> >  			if (*perf_event_fasync(event))
> >  				event->pending_kill = POLL_ERR;
> >  
> > -			perf_event_wakeup(event);
> > +			event->pending_wakeup = 1;
> > +			irq_work_queue(&event->pending_irq);
> >  		} else {
> >  			struct perf_cpu_pmu_context *cpc = this_cpc(event->pmu_ctx->pmu);
> 
> 
> Looks like this https://lore.kernel.org/lkml/20250603045105.1731451-1-namhyung@kernel.org/
> got unnoticed.

Indeed, -ETOODAMNMUCHEMAIL :/

Let me go grab that one.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-02-13 14:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-02-05 10:42 [BUG] PREEMPT_RT: sleeping function called from invalid context in perf_event_wakeup() Zw Tang
2026-02-05 11:08 ` Peter Zijlstra
2026-02-13 12:47   ` Mukesh Ojha
2026-02-13 14:12     ` Peter Zijlstra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®