serial: core: Refactor uart_unlock_and_check_sysrq()
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 10 Mar 2020 17:43:37 +0000 (19:43 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Mar 2020 16:16:42 +0000 (17:16 +0100)
Refactor uart_unlock_and_check_sysrq() to:

  - explicitly show that we release a port lock which makes
    static analyzers happy:

CHECK   drivers/tty/serial/serial_core.c
.../serial_core.c:3290:17: warning: context imbalance in 'uart_unlock_and_check_sysrq' - unexpected unlock

  - use flags instead of irqflags to avoid confusion with IRQ flags

  - provide one return point

  - be more compact

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Dmitry Safonov <0x7f454c46@gmail.com>
Link: https://lore.kernel.org/r/20200310174337.74109-4-andriy.shevchenko@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/serial_core.c
include/linux/serial_core.h

index 752655c80f738eac3bcdd9f9331178e4d0e8c880..38ef6afddce8dd51073046ea58b37249f1e4e652 100644 (file)
@@ -3187,22 +3187,19 @@ int uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch)
 }
 EXPORT_SYMBOL_GPL(uart_prepare_sysrq_char);
 
-void uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long irqflags)
+void uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long flags)
+__releases(&port->lock)
 {
-       int sysrq_ch;
+       if (port->has_sysrq) {
+               int sysrq_ch = port->sysrq_ch;
 
-       if (!port->has_sysrq) {
-               spin_unlock_irqrestore(&port->lock, irqflags);
-               return;
+               port->sysrq_ch = 0;
+               spin_unlock_irqrestore(&port->lock, flags);
+               if (sysrq_ch)
+                       handle_sysrq(sysrq_ch);
+       } else {
+               spin_unlock_irqrestore(&port->lock, flags);
        }
-
-       sysrq_ch = port->sysrq_ch;
-       port->sysrq_ch = 0;
-
-       spin_unlock_irqrestore(&port->lock, irqflags);
-
-       if (sysrq_ch)
-               handle_sysrq(sysrq_ch);
 }
 EXPORT_SYMBOL_GPL(uart_unlock_and_check_sysrq);
 
index 1f4443db547428889d38973a9c1ed1411f64f4b7..92f5eba8605286713abe80873c92488734822fdb 100644 (file)
@@ -462,8 +462,7 @@ extern void uart_insert_char(struct uart_port *port, unsigned int status,
 
 extern int uart_handle_sysrq_char(struct uart_port *port, unsigned int ch);
 extern int uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch);
-extern void uart_unlock_and_check_sysrq(struct uart_port *port,
-                                       unsigned long irqflags);
+extern void uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long flags);
 extern int uart_handle_break(struct uart_port *port);
 
 /*