Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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.

Fixes: 45c054d0815b ("tty: serial: add driver for the SiFive UART")
Signed-off-by: Ryo Takakura <ryotkkr98@gmail.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Cc: stable@vger.kernel.org
Reviewed-by: John Ogness <john.ogness@linutronix.de>
Rule: add
Link: https://lore.kernel.org/stable/20250330003522.386632-1-ryotkkr98%40gmail.com
Link: https://lore.kernel.org/r/20250412001847.183221-1-ryotkkr98@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Ryo Takakura and committed by
Greg Kroah-Hartman
e1ca3ff2 ee6a44da

+6
+6
drivers/tty/serial/sifive.c
··· 563 563 static int sifive_serial_startup(struct uart_port *port) 564 564 { 565 565 struct sifive_serial_port *ssp = port_to_sifive_serial_port(port); 566 + unsigned long flags; 566 567 568 + uart_port_lock_irqsave(&ssp->port, &flags); 567 569 __ssp_enable_rxwm(ssp); 570 + uart_port_unlock_irqrestore(&ssp->port, flags); 568 571 569 572 return 0; 570 573 } ··· 575 572 static void sifive_serial_shutdown(struct uart_port *port) 576 573 { 577 574 struct sifive_serial_port *ssp = port_to_sifive_serial_port(port); 575 + unsigned long flags; 578 576 577 + uart_port_lock_irqsave(&ssp->port, &flags); 579 578 __ssp_disable_rxwm(ssp); 580 579 __ssp_disable_txwm(ssp); 580 + uart_port_unlock_irqrestore(&ssp->port, flags); 581 581 } 582 582 583 583 /**