diff options
author | John Ogness <john.ogness@linutronix.de> | 2022-11-16 17:27:49 +0106 |
---|---|---|
committer | Petr Mladek <pmladek@suse.com> | 2022-12-02 11:25:02 +0100 |
commit | 6193bc90849a711e3b67bc6051e1bb0254c51f2a (patch) | |
tree | 666d32c46e5bd5bf9279530fd616d62c15a9e729 /drivers/tty/serial | |
parent | 66857443699b34c8c5951dd421f1c528c9554bb5 (diff) | |
download | linux-stable-6193bc90849a711e3b67bc6051e1bb0254c51f2a.tar.gz linux-stable-6193bc90849a711e3b67bc6051e1bb0254c51f2a.tar.bz2 linux-stable-6193bc90849a711e3b67bc6051e1bb0254c51f2a.zip |
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 <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
Diffstat (limited to 'drivers/tty/serial')
-rw-r--r-- | drivers/tty/serial/kgdboc.c | 16 |
1 files changed, 12 insertions, 4 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,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 |