• Shinya Kuribayashi's avatar
    serial: sh-sci: add locking to console write function to avoid SMP lockup · 40f70c03
    Shinya Kuribayashi authored
    Symptom:
    
    When entering the suspend with Android logcat running, printk() call
    gets stuck and never returns.  The issue can be observed at printk()s
    on nonboot CPUs when going to offline with their interrupts disabled,
    and never seen at boot CPU (core0 in our case).
    
    Details:
    
    serial_console_write() lacks of appropriate spinlock handling.
    
    In SMP systems, as long as sci_transmit_chars() is being processed
    at one CPU core, serial_console_write() can stuck at the other CPU
    core(s), when it tries to access to the same serial port _without_
    a proper locking.  serial_console_write() waits for the transmit FIFO
    getting empty, while sci_transmit_chars() writes data to the FIFO.
    
    In general, peripheral interrupts are routed to boot CPU (core0) by
    Linux ARM standard affinity settings.  SCI(F) interrupts are handled
    by core0, so sci_transmit_chars() is processed on core0 as well.
    
    When logcat is running, it writes enormous log data to the kernel at
    every moment, forever.  So core0 can repeatedly continue to process
    sci_transmit_chars() in its interrupt handler, which eventually makes
    the other CPU core(s) stuck at serial_console_write().
    
    Looking at serial/8250.c, this is a known console write lockup issue
    with SMP kernels.  Fix the sh-sci driver in the same way 8250.c does.
    Signed-off-by: default avatarShinya Kuribayashi <shinya.kuribayashi.px@renesas.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    40f70c03
sh-sci.c 57.2 KB