[PATCH] tty: serial: 21285: fix lockup on open

Greg Kroah-Hartman gregkh at linuxfoundation.org
Mon Oct 19 03:00:46 EDT 2020


On Sun, Oct 18, 2020 at 09:42:04AM +0100, Russell King wrote:
> Commit 293f89959483 ("tty: serial: 21285: stop using the unused[]
> variable from struct uart_port") introduced a bug which stops the
> transmit interrupt being disabled when there are no characters to
> transmit - disabling the transmit interrupt at the interrupt controller
> is the only way to stop an interrupt storm. If this interrupt is not
> disabled when there are no transmit characters, we end up with an
> interrupt storm which prevents the machine making forward progress.
> 
> Fixes: 293f89959483 ("tty: serial: 21285: stop using the unused[] variable from struct uart_port")
> Signed-off-by: Russell King <rmk+kernel at armlinux.org.uk>
> ---
>  drivers/tty/serial/21285.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/tty/serial/21285.c b/drivers/tty/serial/21285.c
> index 718e010fcb04..09baef4ccc39 100644
> --- a/drivers/tty/serial/21285.c
> +++ b/drivers/tty/serial/21285.c
> @@ -50,25 +50,25 @@ static const char serial21285_name[] = "Footbridge UART";
>  
>  static bool is_enabled(struct uart_port *port, int bit)
>  {
> -	unsigned long private_data = (unsigned long)port->private_data;
> +	unsigned long *private_data = (unsigned long *)&port->private_data;
>  
> -	if (test_bit(bit, &private_data))
> +	if (test_bit(bit, private_data))
>  		return true;
>  	return false;
>  }
>  
>  static void enable(struct uart_port *port, int bit)
>  {
> -	unsigned long private_data = (unsigned long)port->private_data;
> +	unsigned long *private_data = (unsigned long *)&port->private_data;
>  
> -	set_bit(bit, &private_data);
> +	set_bit(bit, private_data);
>  }
>  
>  static void disable(struct uart_port *port, int bit)
>  {
> -	unsigned long private_data = (unsigned long)port->private_data;
> +	unsigned long *private_data = (unsigned long *)&port->private_data;
>  
> -	clear_bit(bit, &private_data);
> +	clear_bit(bit, private_data);
>  }
>  
>  #define is_tx_enabled(port)	is_enabled(port, tx_enabled_bit)
> -- 
> 2.20.1
> 

Sorry about this, my fault.  I'll merge this after 5.10-rc1 is out,
thanks for the fix.

greg k-h



More information about the linux-arm-kernel mailing list