serial: 8250: Process sysrq at port unlock time
authorDouglas Anderson <dianders@chromium.org>
Tue, 30 Oct 2018 22:11:07 +0000 (15:11 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 9 Nov 2018 17:07:18 +0000 (09:07 -0800)
Let's take advantage of the new ("serial: core: Allow processing sysrq
at port unlock time") to handle sysrqs more cleanly.

Signed-off-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_aspeed_vuart.c
drivers/tty/serial/8250/8250_fsl.c
drivers/tty/serial/8250/8250_omap.c
drivers/tty/serial/8250/8250_port.c

index 435bec40dee6e4eebb87fc65f8b12489f3f99e77..0438d9a905ce979840b342f34eac5c6873f588dd 100644 (file)
@@ -5,6 +5,10 @@
  *    Copyright (C) 2016 Jeremy Kerr <jk@ozlabs.org>, IBM Corp.
  *    Copyright (C) 2006 Arnd Bergmann <arnd@arndb.de>, IBM Corp.
  */
+#if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
+#define SUPPORT_SYSRQ
+#endif
+
 #include <linux/device.h>
 #include <linux/module.h>
 #include <linux/of_address.h>
@@ -293,7 +297,7 @@ static int aspeed_vuart_handle_irq(struct uart_port *port)
        if (lsr & UART_LSR_THRE)
                serial8250_tx_chars(up);
 
-       spin_unlock_irqrestore(&port->lock, flags);
+       uart_unlock_and_check_sysrq(port, flags);
 
        return 1;
 }
index 6640a4c7ddd1dd5e10f96049249ed97595a365c0..ff3dcaea5d93ec54ab42af31ff9b8a176e0fd69d 100644 (file)
@@ -1,4 +1,8 @@
 // SPDX-License-Identifier: GPL-2.0
+#if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
+#define SUPPORT_SYSRQ
+#endif
+
 #include <linux/serial_reg.h>
 #include <linux/serial_8250.h>
 
@@ -54,7 +58,7 @@ int fsl8250_handle_irq(struct uart_port *port)
                serial8250_tx_chars(up);
 
        up->lsr_saved_flags = orig_lsr;
-       spin_unlock_irqrestore(&up->port.lock, flags);
+       uart_unlock_and_check_sysrq(&up->port, flags);
        return 1;
 }
 EXPORT_SYMBOL_GPL(fsl8250_handle_irq);
index a019286f8bb65c5673285bdd5ad06c7b0a63aae8..ad7ba7d0f28d99082eeaaceee85305a7f67104a2 100644 (file)
@@ -8,6 +8,10 @@
  *
  */
 
+#if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
+#define SUPPORT_SYSRQ
+#endif
+
 #include <linux/device.h>
 #include <linux/io.h>
 #include <linux/module.h>
@@ -1085,7 +1089,7 @@ static int omap_8250_dma_handle_irq(struct uart_port *port)
                }
        }
 
-       spin_unlock_irqrestore(&port->lock, flags);
+       uart_unlock_and_check_sysrq(port, flags);
        serial8250_rpm_put(up);
        return 1;
 }
index f776b3eafb9619578986f2c0a3b0234fc2842067..c39482b961110c3596906881ed0303477d00b4a3 100644 (file)
@@ -1755,7 +1755,7 @@ void serial8250_read_char(struct uart_8250_port *up, unsigned char lsr)
                else if (lsr & UART_LSR_FE)
                        flag = TTY_FRAME;
        }
-       if (uart_handle_sysrq_char(port, ch))
+       if (uart_prepare_sysrq_char(port, ch))
                return;
 
        uart_insert_char(port, lsr, UART_LSR_OE, ch, flag);
@@ -1897,7 +1897,7 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
        if ((!up->dma || up->dma->tx_err) && (status & UART_LSR_THRE))
                serial8250_tx_chars(up);
 
-       spin_unlock_irqrestore(&port->lock, flags);
+       uart_unlock_and_check_sysrq(port, flags);
        return 1;
 }
 EXPORT_SYMBOL_GPL(serial8250_handle_irq);
@@ -3258,9 +3258,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s,
 
        serial8250_rpm_get(up);
 
-       if (port->sysrq)
-               locked = 0;
-       else if (oops_in_progress)
+       if (oops_in_progress)
                locked = spin_trylock_irqsave(&port->lock, flags);
        else
                spin_lock_irqsave(&port->lock, flags);