Patch "serial: 8250_dw: Fix deadlock in LCR workaround" has been added to the 3.10-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
serial: 8250_dw: Fix deadlock in LCR workaround
to the 3.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
serial-8250_dw-fix-deadlock-in-lcr-workaround.patch
and it can be found in the queue-3.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
7fd6f640f2dd17dac6ddd6702c378cb0bb9cfa11Mon Sep 17 00:00:00 2001
From: Peter Hurley <[email protected]>
Date: Wed, 11 Mar 2015 09:19:16 -0400
Subject: serial: 8250_dw: Fix deadlock in LCR workaround
From: Peter Hurley <[email protected]>
commit 7fd6f640f2dd17dac6ddd6702c378cb0bb9cfa11 upstream.
Trying to write console output from within the serial console driver while the port->lock is held causes recursive deadlock:
CPU 0spin_lock_irqsave(&port->lock)printk()
console_unlock()
call_console_drivers()
serial8250_console_write()
spin_lock_irqsave(&port->lock)** DEADLOCK **
The 8250_dw i/o accessors try to write a console error message if the LCR workaround was unsuccessful. When the port->lock is already held (eg., when called from serial8250_set_termios()), this deadlocks.
Make the error message a FIXME until a general solution is devised.
--- drivers/tty/serial/8250/8250_dw.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/tty/serial/8250/8250_dw.c +8 -2
@@ -98,7 +98,10 @@ static void dw8250_serial_out(struct uardw8250_force_idle (p);writeb (value, p->membase + (UART_LCR << p->regshift)); } -dev_err (p->dev,"Couldn't set LCR to %d\n" , value); +/* +* FIXME: this deadlocks if port->lock is already held +* dev_err(p->dev, "Couldn't set LCR to %d\n", value); +*/ } }
@@ -128,7 +131,10 @@ static void dw8250_serial_out32(struct udw8250_force_idle (p);writel (value, p->membase + (UART_LCR << p->regshift)); } -dev_err (p->dev,"Couldn't set LCR to %d\n" , value); +/* +* FIXME: this deadlocks if port->lock is already held +* dev_err(p->dev, "Couldn't set LCR to %d\n", value); +*/ } }
Patches currently in stable-queue which might be from [email protected] are
queue-3.10/serial-8250_dw-fix-deadlock-in-lcr-workaround.patch