Commit 6193bc90 authored by John Ogness's avatar John Ogness Committed by Petr Mladek
Browse files

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: default avatarJohn Ogness <john.ogness@linutronix.de>
Reviewed-by: default avatarDaniel Thompson <daniel.thompson@linaro.org>
Reviewed-by: default avatarPetr Mladek <pmladek@suse.com>
Reviewed-by: default avatarDouglas Anderson <dianders@chromium.org>
Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20221116162152.193147-38-john.ogness@linutronix.de
parent 66857443
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -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