Skip to content
  • Daniel Wagner's avatar
    serial: sh-sci: Use spin_{try}lock_irqsave instead of open coding version · d9c202b2
    Daniel Wagner authored
    commit 8afb1d2c12163f77777f84616a8e9444d0050ebe upstream.
    
    Commit 40f70c03
    
     ("serial: sh-sci: add locking to console write
    function to avoid SMP lockup") copied the strategy to avoid locking
    problems in conjuncture with the console from the UART8250
    driver. Instead using directly spin_{try}lock_irqsave(),
    local_irq_save() followed by spin_{try}lock() was used. While this is
    correct on mainline, for -rt it is a problem. spin_{try}lock() will
    check if it is running in a valid context. Since the local_irq_save()
    has already been executed, the context has changed and
    spin_{try}lock() will complain. The reason why spin_{try}lock()
    complains is that on -rt the spin locks are turned into mutexes and
    therefore can sleep. Sleeping with interrupts disabled is not valid.
    
    BUG: sleeping function called from invalid context at /home/wagi/work/rt/v4.4-cip-rt/kernel/locking/rtmutex.c:995
    in_atomic(): 0, irqs_disabled(): 128, pid: 778, name: irq/76-eth0
    CPU: 0 PID: 778 Comm: irq/76-eth0 Not tainted 4.4.126-test-cip22-rt14-00403-gcd03665c8318 #12
    Hardware name: Generic RZ/G1 (Flattened Device Tree)
    Backtrace:
    [<c00140a0>] (dump_backtrace) from [<c001424c>] (show_stack+0x18/0x1c)
     r7:c06b01f0 r6:60010193 r5:00000000 r4:c06b01f0
    [<c0014234>] (show_stack) from [<c01d3c94>] (dump_stack+0x78/0x94)
    [<c01d3c1c>] (dump_stack) from [<c004c134>] (___might_sleep+0x134/0x194)
     r7:60010113 r6:c06d3559 r5:00000000 r4:ffffe000
    [<c004c000>] (___might_sleep) from [<c04ded60>] (rt_spin_lock+0x20/0x74)
     r5:c06f4d60 r4:c06f4d60
    [<c04ded40>] (rt_spin_lock) from [<c02577e4>] (serial_console_write+0x100/0x118)
     r5:c06f4d60 r4:c06f4d60
    [<c02576e4>] (serial_console_write) from [<c0061060>] (call_console_drivers.constprop.15+0x10c/0x124)
     r10:c06d2894 r9:c04e18b0 r8:00000028 r7:00000000 r6:c06d3559 r5:c06d2798
     r4:c06b9914 r3:c02576e4
    [<c0060f54>] (call_console_drivers.constprop.15) from [<c0062984>] (console_unlock+0x32c/0x430)
     r10:c06d30d8 r9:00000028 r8:c06dd518 r7:00000005 r6:00000000 r5:c06d2798
     r4:c06d2798 r3:00000028
    [<c0062658>] (console_unlock) from [<c0062e1c>] (vprintk_emit+0x394/0x4f0)
     r10:c06d2798 r9:c06d30ee r8:00000006 r7:00000005 r6:c06a78fc r5:00000027
     r4:00000003
    [<c0062a88>] (vprintk_emit) from [<c0062fa0>] (vprintk+0x28/0x30)
     r10:c060bd46 r9:00001000 r8:c06b9a90 r7:c06b9a90 r6:c06b994c r5:c06b9a3c
     r4:c0062fa8
    [<c0062f78>] (vprintk) from [<c0062fb8>] (vprintk_default+0x10/0x14)
    [<c0062fa8>] (vprintk_default) from [<c009cd30>] (printk+0x78/0x84)
    [<c009ccbc>] (printk) from [<c025afdc>] (credit_entropy_bits+0x17c/0x2cc)
     r3:00000001 r2:decade60 r1:c061a5ee r0:c061a523
     r4:00000006
    [<c025ae60>] (credit_entropy_bits) from [<c025bf74>] (add_interrupt_randomness+0x160/0x178)
     r10:466e7196 r9:1f536000 r8:fffeef74 r7:00000000 r6:c06b9a60 r5:c06b9a3c
     r4:dfbcf680
    [<c025be14>] (add_interrupt_randomness) from [<c006536c>] (irq_thread+0x1e8/0x248)
     r10:c006537c r9:c06cdf21 r8:c0064fcc r7:df791c24 r6:df791c00 r5:ffffe000
     r4:df525180
    [<c0065184>] (irq_thread) from [<c003fba4>] (kthread+0x108/0x11c)
     r10:00000000 r9:00000000 r8:c0065184 r7:df791c00 r6:00000000 r5:df791d00
     r4:decac000
    [<c003fa9c>] (kthread) from [<c00101b8>] (ret_from_fork+0x14/0x3c)
     r8:00000000 r7:00000000 r6:00000000 r5:c003fa9c r4:df791d00
    
    Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarDaniel Wagner <daniel.wagner@siemens.com>
    Reviewed-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    d9c202b2