| From 5b35d13b77d63eb39537064de1d527441409e6d4 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 19 Apr 2022 09:39:10 +0800 |
| Subject: tracing: Fix sleeping function called from invalid context on RT |
| kernel |
| |
| From: Jun Miao <jun.miao@intel.com> |
| |
| [ Upstream commit 12025abdc8539ed9d5014e2d647a3fd1bd3de5cd ] |
| |
| When setting bootparams="trace_event=initcall:initcall_start tp_printk=1" in the |
| cmdline, the output_printk() was called, and the spin_lock_irqsave() was called in the |
| atomic and irq disable interrupt context suitation. On the PREEMPT_RT kernel, |
| these locks are replaced with sleepable rt-spinlock, so the stack calltrace will |
| be triggered. |
| Fix it by raw_spin_lock_irqsave when PREEMPT_RT and "trace_event=initcall:initcall_start |
| tp_printk=1" enabled. |
| |
| BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:46 |
| in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 1, name: swapper/0 |
| preempt_count: 2, expected: 0 |
| RCU nest depth: 0, expected: 0 |
| Preemption disabled at: |
| [<ffffffff8992303e>] try_to_wake_up+0x7e/0xba0 |
| CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.17.1-rt17+ #19 34c5812404187a875f32bee7977f7367f9679ea7 |
| Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014 |
| Call Trace: |
| <TASK> |
| dump_stack_lvl+0x60/0x8c |
| dump_stack+0x10/0x12 |
| __might_resched.cold+0x11d/0x155 |
| rt_spin_lock+0x40/0x70 |
| trace_event_buffer_commit+0x2fa/0x4c0 |
| ? map_vsyscall+0x93/0x93 |
| trace_event_raw_event_initcall_start+0xbe/0x110 |
| ? perf_trace_initcall_finish+0x210/0x210 |
| ? probe_sched_wakeup+0x34/0x40 |
| ? ttwu_do_wakeup+0xda/0x310 |
| ? trace_hardirqs_on+0x35/0x170 |
| ? map_vsyscall+0x93/0x93 |
| do_one_initcall+0x217/0x3c0 |
| ? trace_event_raw_event_initcall_level+0x170/0x170 |
| ? push_cpu_stop+0x400/0x400 |
| ? cblist_init_generic+0x241/0x290 |
| kernel_init_freeable+0x1ac/0x347 |
| ? _raw_spin_unlock_irq+0x65/0x80 |
| ? rest_init+0xf0/0xf0 |
| kernel_init+0x1e/0x150 |
| ret_from_fork+0x22/0x30 |
| </TASK> |
| |
| Link: https://lkml.kernel.org/r/20220419013910.894370-1-jun.miao@intel.com |
| |
| Signed-off-by: Jun Miao <jun.miao@intel.com> |
| Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/trace/trace.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
| index 063b434c89d2..017c8dd46b0f 100644 |
| --- a/kernel/trace/trace.c |
| +++ b/kernel/trace/trace.c |
| @@ -2331,7 +2331,7 @@ trace_event_buffer_lock_reserve(struct ring_buffer **current_rb, |
| } |
| EXPORT_SYMBOL_GPL(trace_event_buffer_lock_reserve); |
| |
| -static DEFINE_SPINLOCK(tracepoint_iter_lock); |
| +static DEFINE_RAW_SPINLOCK(tracepoint_iter_lock); |
| static DEFINE_MUTEX(tracepoint_printk_mutex); |
| |
| static void output_printk(struct trace_event_buffer *fbuffer) |
| @@ -2352,14 +2352,14 @@ static void output_printk(struct trace_event_buffer *fbuffer) |
| |
| event = &fbuffer->trace_file->event_call->event; |
| |
| - spin_lock_irqsave(&tracepoint_iter_lock, flags); |
| + raw_spin_lock_irqsave(&tracepoint_iter_lock, flags); |
| trace_seq_init(&iter->seq); |
| iter->ent = fbuffer->entry; |
| event_call->event.funcs->trace(iter, 0, event); |
| trace_seq_putc(&iter->seq, 0); |
| printk("%s", iter->seq.buffer); |
| |
| - spin_unlock_irqrestore(&tracepoint_iter_lock, flags); |
| + raw_spin_unlock_irqrestore(&tracepoint_iter_lock, flags); |
| } |
| |
| int tracepoint_printk_sysctl(struct ctl_table *table, int write, |
| -- |
| 2.35.1 |
| |