• John Ogness's avatar
    tty: serial: kgdboc: fix mutex locking order for configure_kgdboc() · 3ef5abd9
    John Ogness authored
    Several mutexes are taken while setting up console serial ports. In
    particular, the tty_port->mutex and @console_mutex are taken:
    
      serial_pnp_probe
        serial8250_register_8250_port
          uart_add_one_port (locks tty_port->mutex)
            uart_configure_port
              register_console (locks @console_mutex)
    
    In order to synchronize kgdb's tty_find_polling_driver() with
    register_console(), commit 6193bc90 ("tty: serial: kgdboc:
    synchronize tty_find_polling_driver() and register_console()") takes
    the @console_mutex. However, this leads to the following call chain
    (with locking):
    
      platform_probe
        kgdboc_probe
          configure_kgdboc (locks @console_mutex)
            tty_find_polling_driver
              uart_poll_init (locks tty_port->mutex)
                uart_set_options
    
    This is clearly deadlock potential due to the reverse lock ordering.
    
    Since uart_set_options() requires holding @console_mutex in order to
    serialize early initialization of the serial-console lock, take the
    @console_mutex in uart_poll_init() instead of configure_kgdboc().
    
    Since configure_kgdboc() was using @console_mutex for safe traversal
    of the console list, change it to use the SRCU iterator instead.
    
    Add comments to uart_set_options() kerneldoc mentioning that it
    requires holding @console_mutex (aka the console_list_lock).
    
    Fixes: 6193bc90 ("tty: serial: kgdboc: synchronize tty_find_polling_driver() and register_console()")
    Signed-off-by: default avatarJohn Ogness <john.ogness@linutronix.de>
    Reviewed-by: default avatarSergey Senozhatsky <senozhatsky@chromium.org>
    Reviewed-by: default avatarPetr Mladek <pmladek@suse.com>
    [pmladek@suse.com: Export console_srcu_read_lock_is_held() to fix build kgdboc as a module.]
    Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
    Link: https://lore.kernel.org/r/20230112161213.1434854-1-john.ogness@linutronix.de
    3ef5abd9
kgdboc.c 15.4 KB