RE: [PATCH v3] serial: core: Initialise spin lock before use in uart_configure_port()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Andy,

Thank you for the patch.

> -----Original Message-----
> From: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
> Sent: 06 July 2020 22:49
> To: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>; linux-serial@xxxxxxxxxxxxxxx
> Cc: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>; Marc Zyngier <maz@xxxxxxxxxx>; Prabhakar Mahadev Lad
> <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx>; Guenter Roeck <linux@xxxxxxxxxxxx>; Anatoly Pugachev <matorola@xxxxxxxxx>; Tony
> Lindgren <tony@xxxxxxxxxxx>; Geert Uytterhoeven <geert@xxxxxxxxxxxxxx>
> Subject: [PATCH v3] serial: core: Initialise spin lock before use in uart_configure_port()
>
> The comment near to uart_port_spin_lock_init() says:
>
>   Ensure that the serial console lock is initialised early.
>   If this port is a console, then the spinlock is already initialised.
>
> and there is nothing about enabled or disabled consoles. The commit
> a3cb39d258ef ("serial: core: Allow detach and attach serial device
> for console") made a change, which follows the comment, and also to
> prevent reinitialisation of the lock in use, when user detaches and
> attaches back the same console device. But this change discovers
> another issue, that uart_add_one_port() tries to access a spin lock
> that now may be uninitialised. This happens when a driver expects
> the serial core to register a console on its behalf. In this case
> we must initialise a spin lock before use.
>
> Fixes: a3cb39d258ef ("serial: core: Allow detach and attach serial device for console")
> Reported-by: Marc Zyngier <maz@xxxxxxxxxx>
> Reported-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx>
> Reported-by: Guenter Roeck <linux@xxxxxxxxxxxx>
> Reported-by: Anatoly Pugachev <matorola@xxxxxxxxx>
> Acked-by: Marc Zyngier <maz@xxxxxxxxxx>
> Tested-by: Tony Lindgren <tony@xxxxxxxxxxx>
> Cc: Geert Uytterhoeven <geert@xxxxxxxxxxxxxx>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
> ---
> v3: renamed lock init primitive and dropped inline (Marc), added tags (Marc, Tony)
>  drivers/tty/serial/serial_core.c | 16 ++++++++++++++--
>  1 file changed, 14 insertions(+), 2 deletions(-)
>
Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx>

Cheers,
--Prabhakar

> diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
> index 3cc183acf7ba..309fa42b0861 100644
> --- a/drivers/tty/serial/serial_core.c
> +++ b/drivers/tty/serial/serial_core.c
> @@ -1915,6 +1915,12 @@ static inline bool uart_console_enabled(struct uart_port *port)
>  return uart_console(port) && (port->cons->flags & CON_ENABLED);
>  }
>
> +static void __uart_port_spin_lock_init(struct uart_port *port)
> +{
> +spin_lock_init(&port->lock);
> +lockdep_set_class(&port->lock, &port_lock_key);
> +}
> +
>  /*
>   * Ensure that the serial console lock is initialised early.
>   * If this port is a console, then the spinlock is already initialised.
> @@ -1924,8 +1930,7 @@ static inline void uart_port_spin_lock_init(struct uart_port *port)
>  if (uart_console(port))
>  return;
>
> -spin_lock_init(&port->lock);
> -lockdep_set_class(&port->lock, &port_lock_key);
> +__uart_port_spin_lock_init(port);
>  }
>
>  #if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(CONFIG_CONSOLE_POLL)
> @@ -2371,6 +2376,13 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,
>  /* Power up port for set_mctrl() */
>  uart_change_pm(state, UART_PM_STATE_ON);
>
> +/*
> + * If this driver supports console, and it hasn't been
> + * successfully registered yet, initialise spin lock for it.
> + */
> +if (port->cons && !(port->cons->flags & CON_ENABLED))
> +__uart_port_spin_lock_init(port);
> +
>  /*
>   * Ensure that the modem control lines are de-activated.
>   * keep the DTR setting that is set in uart_set_options()
> --
> 2.27.0



Renesas Electronics Europe GmbH, Geschaeftsfuehrer/President: Carsten Jauch, Sitz der Gesellschaft/Registered office: Duesseldorf, Arcadiastrasse 10, 40472 Duesseldorf, Germany, Handelsregister/Commercial Register: Duesseldorf, HRB 3708 USt-IDNr./Tax identification no.: DE 119353406 WEEE-Reg.-Nr./WEEE reg. no.: DE 14978647




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux PPP]     [Linux FS]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Linmodem]     [Device Mapper]     [Linux Kernel for ARM]

  Powered by Linux