]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
serial: core: Use proper spinlock flavor in uart_close()
authorPeter Hurley <peter@hurleysoftware.com>
Fri, 31 Jul 2015 20:59:51 +0000 (16:59 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Aug 2015 05:07:22 +0000 (22:07 -0700)
uart_close() runs in non-atomic context only; use
spin_lock/unlock_irq instead of saving the interrupt state (which
== on).

Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/serial_core.c

index f36852067f20e61ebaf67269ec08c37ea342c06a..6ae7cc118ac4452785079a3f5e6a50125d49601b 100644 (file)
@@ -1377,7 +1377,6 @@ static void uart_close(struct tty_struct *tty, struct file *filp)
        struct uart_state *state = tty->driver_data;
        struct tty_port *port;
        struct uart_port *uport;
-       unsigned long flags;
 
        if (!state) {
                struct uart_driver *drv = tty->driver->driver_state;
@@ -1403,10 +1402,9 @@ static void uart_close(struct tty_struct *tty, struct file *filp)
         * disable the receive line status interrupts.
         */
        if (port->flags & ASYNC_INITIALIZED) {
-               unsigned long flags;
-               spin_lock_irqsave(&uport->lock, flags);
+               spin_lock_irq(&uport->lock);
                uport->ops->stop_rx(uport);
-               spin_unlock_irqrestore(&uport->lock, flags);
+               spin_unlock_irq(&uport->lock);
                /*
                 * Before we drop DTR, make sure the UART transmitter
                 * has completely drained; this is especially
@@ -1419,17 +1417,17 @@ static void uart_close(struct tty_struct *tty, struct file *filp)
        uart_shutdown(tty, state);
        tty_port_tty_set(port, NULL);
 
-       spin_lock_irqsave(&port->lock, flags);
+       spin_lock_irq(&port->lock);
 
        if (port->blocked_open) {
-               spin_unlock_irqrestore(&port->lock, flags);
+               spin_unlock_irq(&port->lock);
                if (port->close_delay)
                        msleep_interruptible(jiffies_to_msecs(port->close_delay));
-               spin_lock_irqsave(&port->lock, flags);
+               spin_lock_irq(&port->lock);
        } else if (!uart_console(uport)) {
-               spin_unlock_irqrestore(&port->lock, flags);
+               spin_unlock_irq(&port->lock);
                uart_change_pm(state, UART_PM_STATE_OFF);
-               spin_lock_irqsave(&port->lock, flags);
+               spin_lock_irq(&port->lock);
        }
 
        /*
@@ -1437,7 +1435,7 @@ static void uart_close(struct tty_struct *tty, struct file *filp)
         */
        clear_bit(ASYNCB_NORMAL_ACTIVE, &port->flags);
        clear_bit(ASYNCB_CLOSING, &port->flags);
-       spin_unlock_irqrestore(&port->lock, flags);
+       spin_unlock_irq(&port->lock);
        wake_up_interruptible(&port->open_wait);
        wake_up_interruptible(&port->close_wait);