lkml.org 
[lkml]   [2022]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 158/339] tracing: Fix sleeping function called from invalid context on RT kernel
    Date
    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 f6fb04d79eba..8d2b5c5ce5b3 100644
    --- a/kernel/trace/trace.c
    +++ b/kernel/trace/trace.c
    @@ -2837,7 +2837,7 @@ trace_event_buffer_lock_reserve(struct trace_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)
    @@ -2865,14 +2865,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


    \
     
     \ /
      Last update: 2022-06-13 15:50    [W:3.588 / U:0.328 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site