]> err.no Git - linux-2.6/commitdiff
[SERIAL] 8250: add locking to console write function
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Tue, 2 May 2006 15:04:29 +0000 (16:04 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 2 May 2006 15:04:29 +0000 (16:04 +0100)
x86 SMP breaks as a result of the previous change, we have no real
option other than to add locking to the 8250 console write function.
If an oops is in progress, try to acquire the lock.  If we fail to
do so, continue anyway.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/serial/8250.c

index e001ea0606ec86ec86718de00cdb167f3ad92f5e..bbf78aaf9e01f074d15bf6db21042feb9dec5591 100644 (file)
@@ -2235,10 +2235,17 @@ static void
 serial8250_console_write(struct console *co, const char *s, unsigned int count)
 {
        struct uart_8250_port *up = &serial8250_ports[co->index];
+       unsigned long flags;
        unsigned int ier;
+       int locked = 1;
 
        touch_nmi_watchdog();
 
+       if (oops_in_progress) {
+               locked = spin_trylock_irqsave(&up->port.lock, flags);
+       } else
+               spin_lock_irqsave(&up->port.lock, flags);
+
        /*
         *      First save the IER then disable the interrupts
         */
@@ -2257,6 +2264,9 @@ serial8250_console_write(struct console *co, const char *s, unsigned int count)
         */
        wait_for_xmitr(up, BOTH_EMPTY);
        serial_out(up, UART_IER, ier);
+
+       if (locked)
+               spin_unlock_irqrestore(&up->port.lock, flags);
 }
 
 static int serial8250_console_setup(struct console *co, char *options)