diff options
author | Borislav Petkov <petkovbb@googlemail.com> | 2008-07-30 01:33:32 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-30 12:41:45 -0400 |
commit | c389d27b5e643d745f55ffb939b1426060ba63d4 (patch) | |
tree | aa7a4903fe58542a716a78e37d518d71727f9475 /drivers/serial | |
parent | 5def9a3a22e09c99717f41ab7f07ec9e1a1f3ec8 (diff) |
8250.c: port.lock is irq-safe
serial8250_startup() doesn't disable interrupts while taking the &up->port.lock
which might race against the interrupt handler serial8250_interrupt(), which
when entered, will deadlock waiting for the lock to be released.
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Tested-by: Ingo Molnar <mingo@elte.hu>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/serial')
-rw-r--r-- | drivers/serial/8250.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index a97f1ae11f78..342e12fb1c25 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c | |||
@@ -1885,7 +1885,7 @@ static int serial8250_startup(struct uart_port *port) | |||
1885 | * the interrupt is enabled. Delays are necessary to | 1885 | * the interrupt is enabled. Delays are necessary to |
1886 | * allow register changes to become visible. | 1886 | * allow register changes to become visible. |
1887 | */ | 1887 | */ |
1888 | spin_lock(&up->port.lock); | 1888 | spin_lock_irqsave(&up->port.lock, flags); |
1889 | if (up->port.flags & UPF_SHARE_IRQ) | 1889 | if (up->port.flags & UPF_SHARE_IRQ) |
1890 | disable_irq_nosync(up->port.irq); | 1890 | disable_irq_nosync(up->port.irq); |
1891 | 1891 | ||
@@ -1901,7 +1901,7 @@ static int serial8250_startup(struct uart_port *port) | |||
1901 | 1901 | ||
1902 | if (up->port.flags & UPF_SHARE_IRQ) | 1902 | if (up->port.flags & UPF_SHARE_IRQ) |
1903 | enable_irq(up->port.irq); | 1903 | enable_irq(up->port.irq); |
1904 | spin_unlock(&up->port.lock); | 1904 | spin_unlock_irqrestore(&up->port.lock, flags); |
1905 | 1905 | ||
1906 | /* | 1906 | /* |
1907 | * If the interrupt is not reasserted, setup a timer to | 1907 | * If the interrupt is not reasserted, setup a timer to |