From 6193bc90849a711e3b67bc6051e1bb0254c51f2a Mon Sep 17 00:00:00 2001 From: John Ogness Date: Wed, 16 Nov 2022 17:27:49 +0106 Subject: [PATCH] tty: serial: kgdboc: synchronize tty_find_polling_driver() and register_console() 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 Reviewed-by: Daniel Thompson Reviewed-by: Petr Mladek Reviewed-by: Douglas Anderson Signed-off-by: Petr Mladek Link: https://lore.kernel.org/r/20221116162152.193147-38-john.ogness@linutronix.de --- drivers/tty/serial/kgdboc.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/tty/serial/kgdboc.c b/drivers/tty/serial/kgdboc.c index 82b4b4d67823..8c2b7ccdfebf 100644 --- a/drivers/tty/serial/kgdboc.c +++ b/drivers/tty/serial/kgdboc.c @@ -189,13 +189,21 @@ static int configure_kgdboc(void) if (kgdboc_register_kbd(&cptr)) goto do_register; - p = tty_find_polling_driver(cptr, &tty_line); - if (!p) - goto noconfig; - - /* For safe traversal of the console list. */ + /* + * 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) { + console_list_unlock(); + goto noconfig; + } + /* * Take console_lock to serialize device() callback with * other console operations. For example, fg_console is