Hi, On Wed, Nov 16, 2022 at 8:22 AM John Ogness <john.ogness@xxxxxxxxxxxxx> wrote: > > 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@xxxxxxxxxxxxx> > Reviewed-by: Daniel Thompson <daniel.thompson@xxxxxxxxxx> > Reviewed-by: Petr Mladek <pmladek@xxxxxxxx> > --- > drivers/tty/serial/kgdboc.c | 16 ++++++++++++---- > 1 file 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(); > + } Seems OK to me, though I guess I would have moved console_lock() up too just because this isn't a case we need to optimize and then we can be extra certain that nobody else is messing with console structures while we're looking at them. Reviewed-by: Douglas Anderson <dianders@xxxxxxxxxxxx>