aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/serial/8250.c
diff options
context:
space:
mode:
authorRussell King <rmk@dyn-67.arm.linux.org.uk>2006-05-02 11:04:29 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2006-05-02 11:04:29 -0400
commitd8a5a8d7cc32e4474326e0ecc1b959063490efc9 (patch)
treeb174cda624301fde6e020e346b60b5e8e31f6283 /drivers/serial/8250.c
parenta88d75b257b2b28b26d7d4d2b640f05feb00ad53 (diff)
[SERIAL] 8250: add locking to console write function
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>
Diffstat (limited to 'drivers/serial/8250.c')
-rw-r--r--drivers/serial/8250.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index e001ea0606ec..bbf78aaf9e01 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -2235,10 +2235,17 @@ static void
2235serial8250_console_write(struct console *co, const char *s, unsigned int count) 2235serial8250_console_write(struct console *co, const char *s, unsigned int count)
2236{ 2236{
2237 struct uart_8250_port *up = &serial8250_ports[co->index]; 2237 struct uart_8250_port *up = &serial8250_ports[co->index];
2238 unsigned long flags;
2238 unsigned int ier; 2239 unsigned int ier;
2240 int locked = 1;
2239 2241
2240 touch_nmi_watchdog(); 2242 touch_nmi_watchdog();
2241 2243
2244 if (oops_in_progress) {
2245 locked = spin_trylock_irqsave(&up->port.lock, flags);
2246 } else
2247 spin_lock_irqsave(&up->port.lock, flags);
2248
2242 /* 2249 /*
2243 * First save the IER then disable the interrupts 2250 * First save the IER then disable the interrupts
2244 */ 2251 */
@@ -2257,6 +2264,9 @@ serial8250_console_write(struct console *co, const char *s, unsigned int count)
2257 */ 2264 */
2258 wait_for_xmitr(up, BOTH_EMPTY); 2265 wait_for_xmitr(up, BOTH_EMPTY);
2259 serial_out(up, UART_IER, ier); 2266 serial_out(up, UART_IER, ier);
2267
2268 if (locked)
2269 spin_unlock_irqrestore(&up->port.lock, flags);
2260} 2270}
2261 2271
2262static int serial8250_console_setup(struct console *co, char *options) 2272static int serial8250_console_setup(struct console *co, char *options)