• Yicong Yang's avatar
    serial: port: Don't suspend if the port is still busy · 43066e32
    Yicong Yang authored
    We accidently met the issue that the bash prompt is not shown after the
    previous command done and until the next input if there's only one CPU
    (In our issue other CPUs are isolated by isolcpus=). Further analysis
    shows it's because the port entering runtime suspend even if there's
    still pending chars in the buffer and the pending chars will only be
    processed in next device resuming. We are using amba-pl011 and the
    problematic flow is like below:
    
    Bash                                         kworker
    tty_write()
      file_tty_write()
        n_tty_write()
          uart_write()
            __uart_start()
              pm_runtime_get() // wakeup waker
                queue_work()
                                                 pm_runtime_work()
                                                   rpm_resume()
                                                    status = RPM_RESUMING
                                                    serial_port_runtime_resume()
                                                      port->ops->start_tx()
                                                        pl011_tx_chars()
                                                          uart_write_wakeup()
            […]
            __uart_start()
              pm_runtime_get() < 0 // because runtime status = RPM_RESUMING
                                   // later data are not commit to the port driver
                                                    status = RPM_ACTIVE
                                                    rpm_idle() -> rpm_suspend()
    
    This patch tries to fix this by checking the port busy before entering
    runtime suspending. A runtime_suspend callback is added for the port
    driver. When entering runtime suspend the callback is invoked, if there's
    still pending chars in the buffer then flush the buffer.
    
    Fixes: 84a9582f ("serial: core: Start managing serial controllers to enable runtime PM")
    Cc: stable <stable@kernel.org>
    Reviewed-by: default avatarTony Lindgren <tony@atomide.com>
    Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: default avatarYicong Yang <yangyicong@hisilicon.com>
    Link: https://lore.kernel.org/r/20240226152351.40924-1-yangyicong@huawei.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    43066e32
serial_port.c 2.95 KB