linux/drivers/tty/serial
Jon Hunter 2a24bb28a3 serial: tegra: Handle another RX race condition
Commit 853a699739 ("serial: tegra: handle race condition on uart rx
side") attempted to fix a race condition between the RX end of
transmission interrupt and RX DMA completion callback. Despite this
fix there is still another case where these two paths can race and
result in duplicated data. The race condition is as follows:

1. DMA completion interrupt occurs and schedules tasklet to call DMA
   callback.
2. DMA callback for the UART driver starts to execute. This will copy
   the data from the DMA buffer and restart the DMA. This is done under
   uart port spinlock.
3. During the callback, UART interrupt is raised for end of receive. The
   UART ISR runs and waits to acquire port spinlock held by the DMA
   callback.
4. DMA callback gives up spinlock after copying the data, but before
   restarting DMA.
5. UART ISR acquires the spin lock and reads the same DMA buffer because
   DMA has not been restarted yet.

The release of the spinlock during the DMA callback was introduced by
commit 9b88748b36 ("tty: serial: tegra: drop uart_port->lock before
calling tty_flip_buffer_push()") to fix a spinlock lock-up issue when
calling tty_flip_buffer_push(). However, since then commit a9c3f68f3c
("tty: Fix low_latency BUG") migrated tty_flip_buffer_push() to always
use a workqueue, allowing tty_flip_buffer_push() to be called from
within atomic sections. Therefore, we can remove the unlocking of the
spinlock from the DMA callback and UART ISR and this will ensure that
the race condition no longer occurs.

Reported-by: Christopher Freeman <cfreeman@nvidia.com>
Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-10-17 21:07:57 -07:00
..
8250 serial: 8250_omap: Remove RTS clear 2015-10-17 21:05:46 -07:00
cpm_uart tty: serial: cpm_uart: Fix module autoload for OF platform driver 2015-10-04 19:09:21 +01:00
jsm serial: jsm: some off by one bugs 2015-03-26 23:00:36 +01:00
21285.c
68328serial.c serial: 68328serial: Use NULL for pointers 2015-10-04 17:44:52 +01:00
altera_jtaguart.c drivers/tty/serial: altera: fix typos in #endif comments 2015-05-06 22:26:58 +02:00
altera_uart.c serial: altera_uart: Use of_property_read_u32 instead of open-coding it 2015-10-04 17:47:49 +01:00
amba-pl010.c serial: Test/disable MSIs if switching from N_PPS 2014-11-06 14:57:27 -08:00
amba-pl011.c Revert "uart: pl011: Rename regs with enumeration" 2015-09-04 09:14:43 -07:00
apbuart.c tty: serial: apbuart: Fix module autoload for OF platform driver 2015-10-04 19:09:21 +01:00
apbuart.h
ar933x_uart.c serial: ar933x_uart: Fix off-by-one for checking valid alias id 2015-03-07 03:20:25 +01:00
arc_uart.c tty: serial: drop owner assignment from platform_drivers 2014-10-20 16:21:45 +02:00
atmel_serial.c serial: atmel: fix compiler warning on address cast 2015-10-17 21:00:11 -07:00
bcm63xx_uart.c tty: serial/bcm63xx_uart: fix sparse warning 2015-03-07 03:13:07 +01:00
bfin_sport_uart.c tty: pr_warning->pr_warn and logging neatening 2014-11-25 17:06:38 -08:00
bfin_sport_uart.h
bfin_uart.c serial: bfin: ctsrts: enfore Kconfig naming convention 2015-05-06 22:26:59 +02:00
clps711x.c serial: mctrl-gpio: rename init function 2015-10-04 18:46:43 +01:00
crisv10.c tty: crisv10.c: move assignment out of if () block 2015-05-10 19:04:17 +02:00
crisv10.h cris: Remove obsolete ASYNC_SPLIT_TERMIOS behavior 2014-11-05 20:18:30 -08:00
digicolor-usart.c tty/serial: digicolor: remove sysrq reference 2015-02-02 10:11:25 -08:00
dz.c
dz.h
earlycon-arm-semihost.c
earlycon.c serial: earlycon: Add support for big-endian MMIO accesses 2015-06-01 06:55:12 +09:00
efm32-uart.c tty: serial: drop owner assignment from platform_drivers 2014-10-20 16:21:45 +02:00
etraxfs-uart.c serial: etraxfs-uart: use mctrl_gpio helpers for handling modem signals 2015-08-04 22:07:20 -07:00
fsl_lpuart.c Merge 4.0-rc7 into tty-next 2015-04-07 11:07:20 +02:00
icom.c tty: icom.c: move assignment out of if () block 2015-05-10 19:04:17 +02:00
icom.h
ifx6x60.c serial: ifx6x60: Remove superfluous casts when calling request_irq() 2015-05-06 22:27:01 +02:00
ifx6x60.h
imx.c Merge 4.3-rc5 into tty-next 2015-10-12 10:54:35 -07:00
ioc3_serial.c tty: ioc3_serial.c: move assignment out of if () block 2015-05-10 19:04:17 +02:00
ioc4_serial.c tty: ioc4_serial.c: move assignment out of if () block 2015-05-10 19:04:17 +02:00
ip22zilog.c serial: use container_of to resolve uart_ip22zilog_port from uart_port 2014-11-05 19:20:52 -08:00
ip22zilog.h
Kconfig serial: mxs-auart+imx: allow compile testing on non-Freescale architectures 2015-10-04 18:46:43 +01:00
kgdb_nmi.c serial: kgdb_nmi: Use bool function return values of true/false not 1/0 2015-05-06 22:26:57 +02:00
kgdboc.c
lantiq.c drivers/tty: make serial/lantic.c driver explicitly non-modular 2015-07-23 18:27:41 -07:00
lpc32xx_hs.c tty: serial: lpc32xx_hs: fix handling platform_get_irq result 2015-10-04 19:09:21 +01:00
m32r_sio_reg.h
m32r_sio.c serial: use container_of to resolve uart_sio_port from uart_port 2014-11-05 19:20:52 -08:00
m32r_sio.h
Makefile serial: stm32-usart: Add STM32 USART Driver 2015-06-10 17:34:26 -07:00
max310x.c drivers/max310: Use the rs485 functions on serial_core 2014-11-06 15:00:15 -08:00
max3100.c tty: max3100: use msecs_to_jiffies for time conversion 2015-03-07 03:13:08 +01:00
mcf.c drivers/tty/serial/mcf.c: fix typo on SERIAL_MCF_CONSOLE 2015-05-06 22:26:59 +02:00
men_z135_uart.c tty: serial: men_z135_uart.c: use mcb memory region size instead of hardcoded one 2015-10-17 21:05:43 -07:00
meson_uart.c ARM: meson: serial: convert iounmap to devm_iounmap 2015-05-06 22:27:02 +02:00
mpc52xx_uart.c serial: mpc52xx: add delay after resetting transmitter to fix broken chars 2015-10-04 17:27:56 +01:00
mpsc.c mpsc: use dma_set_mask insted of dma_supported 2015-10-04 19:14:26 +01:00
msm_serial.c tty: serial: msm: Remove 115.2 Kbps maximum baud rate limitation 2015-10-04 19:15:17 +01:00
msm_serial.h tty: serial: msm: Add RX DMA support 2015-10-04 19:15:17 +01:00
mux.c serial: mux: Convert to uart_console_device instead of open-coded 2015-10-04 17:44:52 +01:00
mxs-auart.c serial: mctrl-gpio: rename init function 2015-10-04 18:46:43 +01:00
netx-serial.c tty: serial: drop owner assignment from platform_drivers 2014-10-20 16:21:45 +02:00
nwpserial.c
of_serial.c serial: Enable Freescale 16550 workaround on arm 2015-10-17 21:05:46 -07:00
omap-serial.c serial: omap: remove warnings about unused functions 2015-10-04 19:14:26 +01:00
pch_uart.c
pmac_zilog.c tty: constify of_device_id array 2015-03-26 22:49:10 +01:00
pmac_zilog.h
pnx8xxx_uart.c Driver core patches for 3.19-rc1 2014-12-14 16:10:09 -08:00
pxa.c tty: constify of_device_id array 2015-03-26 22:49:10 +01:00
rp2.c
sa1100.c Driver core patches for 3.19-rc1 2014-12-14 16:10:09 -08:00
samsung.c serial: samsung: Fix UART status handling in DMA mode 2015-10-04 17:44:52 +01:00
samsung.h serial: samsung: fix DMA mode enter condition for small FIFO sizes 2015-08-04 22:07:23 -07:00
sb1250-duart.c
sc16is7xx.c sc16is7xx: null ptr check 2015-10-04 19:14:26 +01:00
sccnxp.c tty: serial: drop owner assignment from platform_drivers 2014-10-20 16:21:45 +02:00
serial_core.c serial_core: support native endianness 2015-10-04 19:11:05 +01:00
serial_ks8695.c tty/serial: kill off set_irq_flags usage 2015-06-09 12:26:32 -07:00
serial_mctrl_gpio.c serial: mctrl_gpio: implement interrupt handling 2015-10-04 18:47:51 +01:00
serial_mctrl_gpio.h serial: mctrl_gpio: implement interrupt handling 2015-10-04 18:47:51 +01:00
serial_txx9.c tty: serial: drop owner assignment from platform_drivers 2014-10-20 16:21:45 +02:00
serial-tegra.c serial: tegra: Handle another RX race condition 2015-10-17 21:07:57 -07:00
sh-sci.c serial: sh-sci: Add DT support to DMA setup 2015-10-04 17:36:10 +01:00
sh-sci.h serial: sh-sci: Correct SCIF_ERROR_CLEAR for plain SCIF 2015-10-04 17:33:48 +01:00
sirfsoc_uart.c serial: sirf: let uart's receive start in right place 2015-07-23 15:32:04 -07:00
sirfsoc_uart.h serial: sirf: let uart's receive start in right place 2015-07-23 15:32:04 -07:00
sn_console.c drivers/tty: make serial/sn_console.c driver explicitly non-modular 2015-07-23 18:27:41 -07:00
sprd_serial.c tty: serial: sprd: Fix module autoload for OF platform driver 2015-10-04 19:09:21 +01:00
st-asc.c tty/serial: st-asc: drop the use of IRQF_NO_SUSPEND 2015-10-04 19:11:05 +01:00
stm32-usart.c tty/serial: st-asc: drop the use of IRQF_NO_SUSPEND 2015-10-04 19:11:05 +01:00
suncore.c drivers/tty: make serial/suncore.c driver explicitly non-modular 2015-07-23 18:27:41 -07:00
sunhv.c drivers/tty: make serial/sunhv.c driver explicitly non-modular 2015-07-23 18:27:41 -07:00
sunsab.c Driver core patches for 3.19-rc1 2014-12-14 16:10:09 -08:00
sunsab.h
sunsu.c Driver core patches for 3.19-rc1 2014-12-14 16:10:09 -08:00
sunzilog.c Driver core patches for 3.19-rc1 2014-12-14 16:10:09 -08:00
sunzilog.h
tilegx.c
timbuart.c Driver core patches for 3.19-rc1 2014-12-14 16:10:09 -08:00
timbuart.h
uartlite.c serial: xilinx: Use platform_get_irq to get irq description structure 2015-04-28 14:26:21 +02:00
ucc_uart.c serial/uuc_uart: Support higher bitrates than 115200 Bit/s 2015-07-23 18:05:00 -07:00
vr41xx_siu.c tty: serial: drop owner assignment from platform_drivers 2014-10-20 16:21:45 +02:00
vt8500_serial.c tty: serial: drop owner assignment from platform_drivers 2014-10-20 16:21:45 +02:00
xilinx_uartps.c serial: xuartps: add __init to earlycon write method 2015-05-10 19:10:08 +02:00
zs.c
zs.h