tty: serial: msm_serial: Fix lockup for sysrq and oops
As the commit677fe555cb
("serial: imx: Fix recursive locking bug") has mentioned the uart driver might cause recursive locking between normal printing and the kernel debugging facilities (e.g. sysrq and oops). In the commit it gave out suggestion for fixing recursive locking issue: "The solution is to avoid locking in the sysrq case and trylock in the oops_in_progress case." This patch follows the suggestion (also used the exactly same code with other serial drivers, e.g. amba-pl011.c) to fix the recursive locking issue, this can avoid stuck caused by deadlock and print out log for sysrq and oops. Fixes:04896a77a9
("msm_serial: serial driver for MSM7K onboard serial peripheral.") Signed-off-by: Leo Yan <leo.yan@linaro.org> Reviewed-by: Jeffrey Hugo <jeffrey.l.hugo@gmail.com> Link: https://lore.kernel.org/r/20191127141544.4277-2-leo.yan@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
e42617b825
commit
0e4f7f920a
|
@ -1580,6 +1580,7 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
||||||
int num_newlines = 0;
|
int num_newlines = 0;
|
||||||
bool replaced = false;
|
bool replaced = false;
|
||||||
void __iomem *tf;
|
void __iomem *tf;
|
||||||
|
int locked = 1;
|
||||||
|
|
||||||
if (is_uartdm)
|
if (is_uartdm)
|
||||||
tf = port->membase + UARTDM_TF;
|
tf = port->membase + UARTDM_TF;
|
||||||
|
@ -1592,7 +1593,13 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
||||||
num_newlines++;
|
num_newlines++;
|
||||||
count += num_newlines;
|
count += num_newlines;
|
||||||
|
|
||||||
spin_lock(&port->lock);
|
if (port->sysrq)
|
||||||
|
locked = 0;
|
||||||
|
else if (oops_in_progress)
|
||||||
|
locked = spin_trylock(&port->lock);
|
||||||
|
else
|
||||||
|
spin_lock(&port->lock);
|
||||||
|
|
||||||
if (is_uartdm)
|
if (is_uartdm)
|
||||||
msm_reset_dm_count(port, count);
|
msm_reset_dm_count(port, count);
|
||||||
|
|
||||||
|
@ -1628,7 +1635,9 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
||||||
iowrite32_rep(tf, buf, 1);
|
iowrite32_rep(tf, buf, 1);
|
||||||
i += num_chars;
|
i += num_chars;
|
||||||
}
|
}
|
||||||
spin_unlock(&port->lock);
|
|
||||||
|
if (locked)
|
||||||
|
spin_unlock(&port->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void msm_console_write(struct console *co, const char *s,
|
static void msm_console_write(struct console *co, const char *s,
|
||||||
|
|
Loading…
Reference in New Issue