Messages in this thread Patch in this message | | | From | Sebastian Andrzej Siewior <> | Subject | [RFC PATCH] tty: serial: core: Only invoke ->start_tx() if there is data to send | Date | Wed, 10 Sep 2014 21:33:21 +0200 |
| |
I noticed that the serial8250_tx_dma() is invoked sometimes while uart_circ_empty() says that the buffer is empty.
I tracked one occuring down to:
n_tty_write() => O_OPOST(tty)) => the while loop did something but neither tty's ->write() nor its ->uart_put_char() callback was invoked(). => tty->ops->flush_chars() is invoked with an empty buffer.
For the 8250 uart driver we end up with: - DMA enabled nothing, just return (except there is DMA_TX bug or runtime-PM then we behave like in the no DMA case)
- no DMA enable THRI interrupt, wait for it, disable THRI interrupt again because there is nothing to be done.
While I don't know if it safe to drop that flush in n_tty if the buffer is empty, it should not do any harm in serial's core part to not invoke ->start_tx() if the buffer is empty.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- drivers/tty/serial/serial_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c index 5a78f6940760..e55724a911d5 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -90,7 +90,8 @@ static void __uart_start(struct tty_struct *tty) struct uart_state *state = tty->driver_data; struct uart_port *port = state->uart_port; - if (!tty->stopped && !tty->hw_stopped) + if (!tty->stopped && !tty->hw_stopped && + !uart_circ_empty(&port->state->xmit)) port->ops->start_tx(port); } -- 2.1.0
| |