[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250330111515.393038-1-ryotkkr98@gmail.com>
Date: Sun, 30 Mar 2025 20:15:15 +0900
From: Ryo Takakura <ryotkkr98@...il.com>
To: alex@...ti.fr,
aou@...s.berkeley.edu,
gregkh@...uxfoundation.org,
jirislaby@...nel.org,
john.ogness@...utronix.de,
palmer@...belt.com,
paul.walmsley@...ive.com,
pmladek@...e.com,
samuel.holland@...ive.com,
bigeasy@...utronix.de,
conor.dooley@...rochip.com,
u.kleine-koenig@...libre.com
Cc: linux-kernel@...r.kernel.org,
linux-riscv@...ts.infradead.org,
linux-serial@...r.kernel.org,
stable@...r.kernel.org,
Ryo Takakura <ryotkkr98@...il.com>
Subject: [PATCH v3 1/2] serial: sifive: lock port in startup()/shutdown() callbacks
startup()/shutdown() callbacks access SIFIVE_SERIAL_IE_OFFS.
The register is also accessed from write() callback.
If console were printing and startup()/shutdown() callback
gets called, its access to the register could be overwritten.
Add port->lock to startup()/shutdown() callbacks to make sure
their access to SIFIVE_SERIAL_IE_OFFS is synchronized against
write() callback.
Signed-off-by: Ryo Takakura <ryotkkr98@...il.com>
Cc: stable@...r.kernel.org
---
drivers/tty/serial/sifive.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/tty/serial/sifive.c b/drivers/tty/serial/sifive.c
index 5904a2d4c..054a8e630 100644
--- a/drivers/tty/serial/sifive.c
+++ b/drivers/tty/serial/sifive.c
@@ -563,8 +563,11 @@ static void sifive_serial_break_ctl(struct uart_port *port, int break_state)
static int sifive_serial_startup(struct uart_port *port)
{
struct sifive_serial_port *ssp = port_to_sifive_serial_port(port);
+ unsigned long flags;
+ uart_port_lock_irqsave(&ssp->port, &flags);
__ssp_enable_rxwm(ssp);
+ uart_port_unlock_irqrestore(&ssp->port, flags);
return 0;
}
@@ -572,9 +575,12 @@ static int sifive_serial_startup(struct uart_port *port)
static void sifive_serial_shutdown(struct uart_port *port)
{
struct sifive_serial_port *ssp = port_to_sifive_serial_port(port);
+ unsigned long flags;
+ uart_port_lock_irqsave(&ssp->port, &flags);
__ssp_disable_rxwm(ssp);
__ssp_disable_txwm(ssp);
+ uart_port_unlock_irqrestore(&ssp->port, flags);
}
/**
--
2.34.1
Powered by blists - more mailing lists