serial-uartlite: Spinlock inside the loop.
authorMaarten Brock <m.brock@vanmierlo.com>
Tue, 16 Feb 2016 17:59:03 +0000 (18:59 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 8 Mar 2016 00:11:14 +0000 (16:11 -0800)
Better to hold the spinlock as short as possible.

Signed-off-by: Maarten Brock <m.brock@vanmierlo.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/uartlite.c

index f4ad0db..9ffbeef 100644 (file)
@@ -193,19 +193,18 @@ static int ulite_transmit(struct uart_port *port, int stat)
 static irqreturn_t ulite_isr(int irq, void *dev_id)
 {
        struct uart_port *port = dev_id;
-       int busy, n = 0;
+       int stat, busy, n = 0;
        unsigned long flags;
 
-       spin_lock_irqsave(&port->lock, flags);
        do {
-               int stat = uart_in32(ULITE_STATUS, port);
+               spin_lock_irqsave(&port->lock, flags);
+               stat = uart_in32(ULITE_STATUS, port);
                busy  = ulite_receive(port, stat);
                busy |= ulite_transmit(port, stat);
+               spin_unlock_irqrestore(&port->lock, flags);
                n++;
        } while (busy);
 
-       spin_unlock_irqrestore(&port->lock, flags);
-
        /* work done? */
        if (n > 1) {
                tty_flip_buffer_push(&port->state->port);