irq_work_run() is called to handle the pending perf events under interrupt context(decrementer overflows exception handler) on powerpc platform, however, this would trigger the below warning when run 'perf top' command which is caused by the sleeppable spin_lock in __wake_up() functionin in preempt_rt kernel: BUG: sleeping function called from invalid context at linux/kernel/rtmutex.c:658 in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper/0 Call Trace: [c0c0fd80] [c040a1b4] show_stack+0x10c/0x1c0 (unreliable) [c0c0fdd0] [c09c3c48] dump_stack+0x24/0x34 [c0c0fde0] [c045f728] __might_sleep+0xd8/0xfc [c0c0fdf0] [c09bb750] rt_spin_lock+0x34/0x7c [c0c0fe00] [c0462e44] __wake_up+0x38/0x70 [c0c0fe20] [c04df740] perf_event_wakeup+0x40/0x90 [c0c0fe50] [c04df7d0] perf_pending_event+0x40/0x6c [c0c0fe60] [c04da4d4] irq_work_run+0x84/0xc4 [c0c0fe80] [c040bd54] timer_interrupt+0x1ec/0x3d0 [c0c0fec0] [c0411728] ret_from_except+0x0/0x18
Inspired by upstream(git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git) commit 8baf86762 "x86-no-perf-irq-work-rt.patch", we can run the irq-work under softirq context in rt kernel to resolve this problem. Signed-off-by: Xufeng Zhang <[email protected]> --- arch/powerpc/kernel/time.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 31e2c31..9a6b81c 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -452,6 +452,7 @@ DEFINE_PER_CPU(u8, irq_work_pending); #endif /* 32 vs 64 bit */ +#ifndef CONFIG_PREEMPT_RT_FULL void arch_irq_work_raise(void) { preempt_disable(); @@ -459,6 +460,7 @@ void arch_irq_work_raise(void) set_dec(1); preempt_enable(); } +#endif #else /* CONFIG_IRQ_WORK */ -- 1.7.1 _______________________________________________ linux-yocto mailing list [email protected] https://lists.yoctoproject.org/listinfo/linux-yocto
