tty: serial: kgdboc: synchronize tty_find_polling_driver() and register_console()
authorJohn Ogness <john.ogness@linutronix.de>
Wed, 16 Nov 2022 16:21:49 +0000 (17:27 +0106)
committerPetr Mladek <pmladek@suse.com>
Fri, 2 Dec 2022 10:25:02 +0000 (11:25 +0100)
Calling tty_find_polling_driver() can lead to uart_set_options() being
called (via the poll_init() callback of tty_operations) to configure the
uart. But uart_set_options() can also be called by register_console()
(via the setup() callback of console).

Take the console_list_lock to synchronize against register_console() and
also use it for console list traversal. This also ensures the console list
cannot change until the polling console has been chosen.

Signed-off-by: John Ogness <john.ogness@linutronix.de>
Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Petr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20221116162152.193147-38-john.ogness@linutronix.de
drivers/tty/serial/kgdboc.c

index 82b4b4d67823d392e911dabb4d23e258249b59f2..8c2b7ccdfebf5cb7607ed69bef72f24c77cffcfb 100644 (file)
@@ -189,12 +189,20 @@ static int configure_kgdboc(void)
        if (kgdboc_register_kbd(&cptr))
                goto do_register;
 
+       /*
+        * tty_find_polling_driver() can call uart_set_options()
+        * (via poll_init) to configure the uart. Take the console_list_lock
+        * in order to synchronize against register_console(), which can also
+        * configure the uart via uart_set_options(). This also allows safe
+        * traversal of the console list.
+        */
+       console_list_lock();
+
        p = tty_find_polling_driver(cptr, &tty_line);
-       if (!p)
+       if (!p) {
+               console_list_unlock();
                goto noconfig;
-
-       /* For safe traversal of the console list. */
-       console_list_lock();
+       }
 
        /*
         * Take console_lock to serialize device() callback with