Hi! Johan Hovold <johan@xxxxxxxxxx> writes: > On Wed, Dec 09, 2020 at 10:17:27AM +0100, Steffen Trumtrar wrote: >> In most cases serial8250_tx_chars is called with spinlock held. >> Fix the remaining location, too. > > Please explain where __start_tx() is called without holding the port > lock and consider fixing that up. > >> Signed-off-by: Steffen Trumtrar <s.trumtrar@xxxxxxxxxxxxxx> >> --- >> drivers/tty/serial/8250/8250_port.c | 6 +++++- >> 1 file changed, 5 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c >> index b0af13074cd3..3310c2b70138 100644 >> --- a/drivers/tty/serial/8250/8250_port.c >> +++ b/drivers/tty/serial/8250/8250_port.c >> @@ -1559,6 +1559,7 @@ static void serial8250_stop_tx(struct uart_port *port) >> static inline void __start_tx(struct uart_port *port) >> { >> struct uart_8250_port *up = up_to_u8250p(port); >> + unsigned long flags; >> >> if (up->dma && !up->dma->tx_dma(up)) >> return; >> @@ -1569,8 +1570,11 @@ static inline void __start_tx(struct uart_port *port) >> >> lsr = serial_in(up, UART_LSR); >> up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; >> - if (lsr & UART_LSR_THRE) >> + if (lsr & UART_LSR_THRE) { >> + spin_lock_irqsave(&port->lock, flags); >> serial8250_tx_chars(up); >> + spin_unlock_irqrestore(&port->lock, flags); >> + } > > Since several callers of __start_tx() do hold the lock, this change will > introduce a deadlock. > Meh, yeah :( Seem like the correct solution would be to fix start_tx_rs485 and serial8250_start_tx instead. Best regards, Steffen Trumtrar -- Pengutronix e.K. | Dipl.-Inform. Steffen Trumtrar | Steuerwalder Str. 21 | https://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686| Fax: +49-5121-206917-5555 |