Message ID | 20230525093159.223817-1-john.ogness@linutronix.de |
---|---|
Headers | show |
Series | synchronize UART_IER access against console write | expand |
* John Ogness <john.ogness@linutronix.de> [230525 09:34]: > omap8250_irq() accesses UART_IER. This register is modified twice > by each console write (serial8250_console_write()) under the port > lock. omap8250_irq() must also take the port lock to guanentee > synchronized access to UART_IER. > > Since the port lock is already being taken for the stop_rx() callback > and since it is safe to call cancel_delayed_work() while holding the > port lock, simply extend the port lock region to include UART_IER > access. > > Fixes: 1fe0e1fa3209 ("serial: 8250_omap: Handle optional overrun-throttle-ms property") > Signed-off-by: John Ogness <john.ogness@linutronix.de> Reviewed-by: Tony Lindgren <tony@atomide.com> > --- > drivers/tty/serial/8250/8250_omap.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c > index 34939462fd69..3225c95fde1d 100644 > --- a/drivers/tty/serial/8250/8250_omap.c > +++ b/drivers/tty/serial/8250/8250_omap.c > @@ -659,17 +659,18 @@ static irqreturn_t omap8250_irq(int irq, void *dev_id) > if ((lsr & UART_LSR_OE) && up->overrun_backoff_time_ms > 0) { > unsigned long delay; > > + /* Synchronize UART_IER access against the console. */ > + spin_lock(&port->lock); > up->ier = port->serial_in(port, UART_IER); > if (up->ier & (UART_IER_RLSI | UART_IER_RDI)) { > - spin_lock(&port->lock); > port->ops->stop_rx(port); > - spin_unlock(&port->lock); > } else { > /* Keep restarting the timer until > * the input overrun subsides. > */ > cancel_delayed_work(&up->overrun_backoff); > } > + spin_unlock(&port->lock); > > delay = msecs_to_jiffies(up->overrun_backoff_time_ms); > schedule_delayed_work(&up->overrun_backoff, delay); > -- > 2.30.2 >