1. 16 Jan, 2023 1 commit
    • 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
  2. 02 Dec, 2022 39 commits