Commit c389d27b authored by Borislav Petkov's avatar Borislav Petkov Committed by Linus Torvalds
Browse files

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: default avatarBorislav Petkov <petkovbb@gmail.com>
Tested-by: default avatarIngo Molnar <mingo@elte.hu>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 5def9a3a
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1885,7 +1885,7 @@ static int serial8250_startup(struct uart_port *port)
		 * the interrupt is enabled.  Delays are necessary to
		 * allow register changes to become visible.
		 */
		spin_lock(&up->port.lock);
		spin_lock_irqsave(&up->port.lock, flags);
		if (up->port.flags & UPF_SHARE_IRQ)
			disable_irq_nosync(up->port.irq);

@@ -1901,7 +1901,7 @@ static int serial8250_startup(struct uart_port *port)

		if (up->port.flags & UPF_SHARE_IRQ)
			enable_irq(up->port.irq);
		spin_unlock(&up->port.lock);
		spin_unlock_irqrestore(&up->port.lock, flags);

		/*
		 * If the interrupt is not reasserted, setup a timer to