Patch "tty: serial: men_z135_uart.c: Fix race between IRQ and set_termios()" has been added to the 4.2-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
tty: serial: men_z135_uart.c: Fix race between IRQ and set_termios()
to the 4.2-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
tty-serial-men_z135_uart.c-fix-race-between-irq-and-set_termios.patch
and it can be found in the queue-4.2 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
8117e347406278fd399b077add4e638cd017ae2dMon Sep 17 00:00:00 2001
From: Johannes Thumshirn <[email protected]>
Date: Thu, 6 Aug 2015 09:16:37 +0200
Subject: tty: serial: men_z135_uart.c: Fix race between IRQ and set_termios()
From: Johannes Thumshirn <[email protected]>
commit 8117e347406278fd399b077add4e638cd017ae2d upstream.
Fix panic caused by a race between men_z135_intr() and men_z135_set_termios().
men_z135_intr() and men_z135_set_termios() both hold the struct uart_port::lock spinlock, but men_z135_intr() does a spin_lock_irqsave() and men_z135_set_termios() does a normal spin_lock(), which can lead to a deadlock when an interrupt is called while the lock is being helt by men_z135_set_termios().
This was discovered using a insmod, hardware looppback send/receive, rmmod stress test.
--- drivers/tty/serial/men_z135_uart.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/tty/serial/men_z135_uart.c +4 -5
@@ -392,7 +392,6 @@ static irqreturn_t men_z135_intr(int irqstruct men_z135_port *uart = (struct men_z135_port *)data;struct uart_port *port = &uart->port;bool handled = false; -unsigned long flags;int irq_id; uart->stat_reg =ioread32 (port->membase +MEN_Z135_STAT_REG );
@@ -401,7 +400,7 @@ static irqreturn_t men_z135_intr(int irqif (!irq_id) goto out; -spin_lock_irqsave (&port->lock, flags); +spin_lock (&port->lock);/* It's save to write to IIR[7:6] RXC[9:8] */ iowrite8 (irq_id, port->membase +MEN_Z135_STAT_REG );
@@ -427,7 +426,7 @@ static irqreturn_t men_z135_intr(int irq handled = true; } -spin_unlock_irqrestore (&port->lock, flags); +spin_unlock (&port->lock); out:return IRQ_RETVAL (handled); }
@@ -717,7 +716,7 @@ static void men_z135_set_termios(struct baud =uart_get_baud_rate (port, termios, old,0 , uart_freq /16 ); -spin_lock (&port->lock); +spin_lock_irq (&port->lock);if (tty_termios_baud_rate (termios))tty_termios_encode_baud_rate (termios, baud, baud);
@@ -725,7 +724,7 @@ static void men_z135_set_termios(structiowrite32 (bd_reg, port->membase +MEN_Z135_BAUD_REG );uart_update_timeout (port, termios->c_cflag, baud); -spin_unlock (&port->lock); +spin_unlock_irq (&port->lock); }static const char *men_z135_type (struct uart_port *port)
Patches currently in stable-queue which might be from [email protected] are
queue-4.2/tty-serial-men_z135_uart.c-fix-race-between-irq-and-set_termios.patch