1
0
Fork 0
alistair23-linux/drivers/tty/serial/8250
Taichi Kageyama 9a23a1d10b serial: 8250: Fix autoconfig_irq() to avoid race conditions
The following race conditions can happen when a serial port is used
as console.

Case1: CPU_B is used to detect an interrupt from a serial port,
       but it can have interrupts disabled during the waiting time.
Case2: CPU_B clears UART_IER just after CPU_A sets UART_IER and then
       a serial port may not make an interrupt.
Case3: CPU_A sets UART_IER just after CPU_B clears UART_IER.
       This is an unexpected behavior for serial8250_console_write().

CPU_A [autoconfig_irq]      |  CPU_B [serial8250_console_write]
----------------------------|---------------------------------------
                            |
probe_irq_on()              |  spin_lock_irqsave(&port->lock,)
serial_outp(,UART_IER,0x0f) |  serial_out(,UART_IER,0)
udelay(20);                 |  uart_console_write()
probe_irq_off()             |
                            |  spin_unlock_irqrestore(&port->lock,)

Case1 and 2 can make autoconfig_irq() failed.
In these cases, the console doesn't work in interrupt mode and
"input overrun" (which can make operation mistakes) can happen
on some systems. Especially in the Case1, It is known that the
problem happens with high rate every boot once it occurs
because the boot sequence is always almost same.

port mutex makes sure that the autoconfig operation is exclusive of
any other concurrent HW access except by the console operation.
console lock is required in autoconfig_irq().

Signed-off-by: Taichi Kageyama <t-kageyama@cp.jp.nec.com>
Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Reviewed-by: Peter Hurley <peter@hurleysoftware.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-10-04 17:30:20 +01:00
..
8250.h serial: 8250: move rx_running out of the bitfield 2015-08-14 17:19:50 -07:00
8250_accent.c
8250_acorn.c tty: remove use of __devexit 2012-11-21 15:27:46 -08:00
8250_boca.c
8250_core.c serial: don't register CIR serial ports 2015-10-04 17:23:52 +01:00
8250_dma.c serial: 8250_dma: don't bother DMA with small transfers 2015-02-02 10:11:26 -08:00
8250_dw.c serial:8250_dw: do not alter CTS and DCTS since AFE is enabled 2015-08-14 17:15:13 -07:00
8250_early.c tty/early: make serial8250_early_{in,out} static again 2015-07-23 17:43:30 -07:00
8250_em.c serial: 8250: remove the redundant include 2015-03-26 22:21:08 +01:00
8250_exar_st16c554.c
8250_fintek.c serial/8250_fintek: Support for any io address. 2015-07-23 15:14:42 -07:00
8250_fourport.c
8250_fsl.c serial: 8250: introduce up_to_u8250p() helper 2014-07-17 18:16:23 -07:00
8250_gsc.c parisc: Fix interrupt routing for C8000 serial ports 2013-07-31 23:42:32 +02:00
8250_hp300.c serial: 8250: remove the redundant include 2015-03-26 22:21:08 +01:00
8250_hub6.c
8250_ingenic.c tty: serial: Drop owner assignment from platform_driver 2015-07-23 18:04:59 -07:00
8250_lpc18xx.c serial: 8250: add LPC18xx/43xx UART driver 2015-06-01 06:56:33 +09:00
8250_mtk.c tty: serial/8250: remove console dependency for mediatek 2015-05-24 13:06:09 -07:00
8250_omap.c serial: 8250_omap: check how many bytes were injected 2015-10-04 17:23:52 +01:00
8250_pci.c serial: 8250_pci: fix mode after S3/S4 resume for F81504/508/512 2015-08-05 12:24:27 -07:00
8250_pnp.c serial: 8250: bind to ALi Fast Infrared Controller (ALI5123) 2015-08-14 17:13:19 -07:00
8250_port.c serial: 8250: Fix autoconfig_irq() to avoid race conditions 2015-10-04 17:30:20 +01:00
8250_uniphier.c serial: 8250_uniphier: call clk_disable_unprepare() on failure path 2015-08-03 15:51:19 -07:00
Kconfig drivers/tty: make serial 8250_lpc18xx.c Kconfig a tristate 2015-10-04 17:27:56 +01:00
Makefile serial: 8250: Split base port operations from universal driver 2015-07-23 17:43:01 -07:00
serial_cs.c tty: delete non-required instances of include <linux/init.h> 2014-01-07 17:05:21 -08:00