Re: [PATCH 3.10 219/268] tty/serial: atmel: fix race condition (TX+DMA)
Hi Richard, On Tue, Jun 20, 2017 at 09:04:03AM +0200, Richard Genoud wrote: > Hi Willy, > > You can drop this patch. > > There's nothing to fix on 3.10.x since the DMA TX support has been > introduced in 3.12. I've already dropped it as it broke some build. Thanks! Willy
Re: [PATCH 3.10 219/268] tty/serial: atmel: fix race condition (TX+DMA)
Hi Willy, You can drop this patch. There's nothing to fix on 3.10.x since the DMA TX support has been introduced in 3.12. Thanks ! 2017-06-19 20:31 GMT+02:00 Willy Tarreau : > From: Richard Genoud > > commit 31ca2c63fdc0aee725cbd4f207c1256f5deaabde upstream. > > If uart_flush_buffer() is called between atmel_tx_dma() and > atmel_complete_tx_dma(), the circular buffer has been cleared, but not > atmel_port->tx_len. > That leads to a circular buffer overflow (dumping (UART_XMIT_SIZE - > atmel_port->tx_len) bytes). > > Tested-by: Nicolas Ferre > [rg] backport to 3.12 > Signed-off-by: Richard Genoud > Signed-off-by: Greg Kroah-Hartman > Signed-off-by: Willy Tarreau > --- > drivers/tty/serial/atmel_serial.c | 5 + > 1 file changed, 5 insertions(+) > > diff --git a/drivers/tty/serial/atmel_serial.c > b/drivers/tty/serial/atmel_serial.c > index 82127ac..41d1df5 100644 > --- a/drivers/tty/serial/atmel_serial.c > +++ b/drivers/tty/serial/atmel_serial.c > @@ -1090,6 +1090,11 @@ static void atmel_flush_buffer(struct uart_port *port) > UART_PUT_TCR(port, 0); > atmel_port->pdc_tx.ofs = 0; > } > + /* > +* in uart_flush_buffer(), the xmit circular buffer has just > +* been cleared, so we have to reset its length accordingly. > +*/ > + sg_dma_len(&atmel_port->sg_tx) = 0; > } > > /* > -- > 2.8.0.rc2.1.gbe9624a >
[PATCH 3.10 219/268] tty/serial: atmel: fix race condition (TX+DMA)
From: Richard Genoud commit 31ca2c63fdc0aee725cbd4f207c1256f5deaabde upstream. If uart_flush_buffer() is called between atmel_tx_dma() and atmel_complete_tx_dma(), the circular buffer has been cleared, but not atmel_port->tx_len. That leads to a circular buffer overflow (dumping (UART_XMIT_SIZE - atmel_port->tx_len) bytes). Tested-by: Nicolas Ferre [rg] backport to 3.12 Signed-off-by: Richard Genoud Signed-off-by: Greg Kroah-Hartman Signed-off-by: Willy Tarreau --- drivers/tty/serial/atmel_serial.c | 5 + 1 file changed, 5 insertions(+) diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index 82127ac..41d1df5 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c @@ -1090,6 +1090,11 @@ static void atmel_flush_buffer(struct uart_port *port) UART_PUT_TCR(port, 0); atmel_port->pdc_tx.ofs = 0; } + /* +* in uart_flush_buffer(), the xmit circular buffer has just +* been cleared, so we have to reset its length accordingly. +*/ + sg_dma_len(&atmel_port->sg_tx) = 0; } /* -- 2.8.0.rc2.1.gbe9624a