android_kernel_motorola_sm6225/drivers/tty/serial
Shinya Kuribayashi 40f70c03e3 serial: sh-sci: add locking to console write function to avoid SMP lockup
Symptom:

When entering the suspend with Android logcat running, printk() call
gets stuck and never returns.  The issue can be observed at printk()s
on nonboot CPUs when going to offline with their interrupts disabled,
and never seen at boot CPU (core0 in our case).

Details:

serial_console_write() lacks of appropriate spinlock handling.

In SMP systems, as long as sci_transmit_chars() is being processed
at one CPU core, serial_console_write() can stuck at the other CPU
core(s), when it tries to access to the same serial port _without_
a proper locking.  serial_console_write() waits for the transmit FIFO
getting empty, while sci_transmit_chars() writes data to the FIFO.

In general, peripheral interrupts are routed to boot CPU (core0) by
Linux ARM standard affinity settings.  SCI(F) interrupts are handled
by core0, so sci_transmit_chars() is processed on core0 as well.

When logcat is running, it writes enormous log data to the kernel at
every moment, forever.  So core0 can repeatedly continue to process
sci_transmit_chars() in its interrupt handler, which eventually makes
the other CPU core(s) stuck at serial_console_write().

Looking at serial/8250.c, this is a known console write lockup issue
with SMP kernels.  Fix the sh-sci driver in the same way 8250.c does.

Signed-off-by: Shinya Kuribayashi <shinya.kuribayashi.px@renesas.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2012-11-15 18:02:51 -08:00
..
8250 serial: 8250_pci: use module_pci_driver to simplify the code 2012-10-30 14:04:52 -07:00
cpm_uart Powerpc 8xx CPM_UART setting MAXIDL register proportionaly to baud rate 2012-09-26 13:39:39 -07:00
jsm serial: jsm: Convert jsm_printk to jsm_dbg 2012-10-30 14:04:52 -07:00
21285.c Disintegrate asm/system.h for ARM 2012-03-28 18:30:01 +01:00
68328serial.c TTY: call tty_port_destroy in the rest of drivers 2012-11-15 17:20:58 -08:00
altera_jtaguart.c
altera_uart.c tty: serial: altera_uart: Use platform_{get,set}_drvdata 2012-09-05 12:33:39 -07:00
amba-pl010.c drivers/tty/serial/amba-pl0{10,11}.c: use clk_prepare_enable and clk_disable_unprepare 2012-09-05 12:33:39 -07:00
amba-pl011.c serial/amba-pl011: use devm_* managed resources 2012-10-25 11:29:44 -07:00
apbuart.c apbuart: fix section mismatch warning 2011-12-27 16:33:13 -05:00
apbuart.h
ar933x_uart.c tty/serial/ar933x_uart: fix baud rate calculation 2012-11-15 17:15:02 -08:00
arc_uart.c serial/arc-uart: Add new driver 2012-10-30 14:06:52 -07:00
atmel_serial.c tty/serial: atmel_serial: fix RS485 half-duplex problem 2012-04-09 10:30:39 -07:00
bcm63xx_uart.c
bfin_sport_uart.c serial: bfin-sport-uart: Add tty ASYNC_CTS_FLOW flag to do CTS flow control. 2011-12-09 19:05:33 -08:00
bfin_sport_uart.h tty: bfin-sport-uart: Rx interrupt is not called always with irq disabled. 2011-12-09 19:05:33 -08:00
bfin_uart.c serial: bfin-uart: avoid dead lock in rx irq handler in smp kernel 2012-11-15 16:59:58 -08:00
clps711x.c serial: clps711x: Cleanup driver 2012-10-24 11:39:48 -07:00
crisv10.c TTY: use tty_port_link_device 2012-08-13 16:50:19 -07:00
crisv10.h
dz.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
dz.h
efm32-uart.c serial/efm32: add new driver 2012-01-26 11:29:47 -08:00
icom.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
icom.h
ifx6x60.c TTY: call tty_port_destroy in the rest of drivers 2012-11-15 17:20:58 -08:00
ifx6x60.h serial:ifx6x60:Prevent data transfer when IFX6x60 port is shutdown 2012-11-01 08:50:01 -07:00
imx.c ARM: soc: multiplatform enablement 2012-10-01 19:11:38 -07:00
ioc3_serial.c TTY: serial: move the dereference below the NULL test 2012-09-10 16:33:02 -07:00
ioc4_serial.c TTY: serial: move the dereference below the NULL test 2012-09-10 16:33:02 -07:00
ip22zilog.c
ip22zilog.h
Kconfig serial: Unneeded ARCH dependencies are removed 2012-11-15 17:11:42 -08:00
kgdb_nmi.c TTY: call tty_port_destroy in the rest of drivers 2012-11-15 17:20:58 -08:00
kgdboc.c KGDB/KDB fixes and cleanups 2012-10-13 11:16:58 +09:00
lantiq.c SERIAL: MIPS: lantiq: implement OF support 2012-05-21 14:31:54 +01:00
lpc32xx_hs.c serial: Add driver for LPC32xx High Speed UARTs 2012-06-12 15:48:01 -07:00
m32r_sio.c m32r_sio: remove dependency on struct serial_uart_config 2012-09-05 13:15:07 -07:00
m32r_sio.h TTY: serial, include pci.h in m32r_sio 2012-03-08 11:47:02 -08:00
m32r_sio_reg.h m32r: relocate drivers back out of 8250 dir 2012-02-08 15:04:32 -08:00
Makefile serial/arc-uart: Add new driver 2012-10-30 14:06:52 -07:00
max310x.c tty: serial: max310x: Remove explicit use of devm_kfree 2012-09-05 12:33:40 -07:00
max3100.c tty: serial: max3100: Fix error case 2012-09-17 04:45:29 -07:00
mcf.c
mfd.c serial: mfd: Add nmi_touch_watchdog() into the console write function 2012-11-15 17:06:10 -08:00
mpc52xx_uart.c ARM: soc: non-critical bug fixes 2012-10-01 18:02:07 -07:00
mpsc.c
mrst_max3110.c TTY: Remove redundant spi driver bus initialization 2011-11-26 20:19:21 -08:00
mrst_max3110.h
msm_serial.c msm_serial: fix clock rate on DMA-based uarts 2012-09-10 16:33:36 -07:00
msm_serial.h
msm_serial_hs.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
msm_smd_tty.c TTY: use tty_port_register_device 2012-08-13 16:50:19 -07:00
mux.c tty/serial/mux.c: linux/tty.h included twice 2012-02-24 13:50:45 -08:00
mxs-auart.c serial: mxs-auart: put the device in the error path 2012-09-11 12:21:33 -07:00
netx-serial.c
nwpserial.c
of_serial.c tty: of_serial: fix return value check in of_platform_serial_setup() 2012-11-01 08:50:01 -07:00
omap-serial.c Merge 3.7-rc3 into tty-next 2012-10-29 09:00:57 -07:00
pch_uart.c pch_uart: check kzalloc result in dma_handle_tx() 2012-08-16 12:10:16 -07:00
pmac_zilog.c pmac_zilog,kdb: Fix console poll hook to return instead of loop 2012-08-16 12:20:20 -07:00
pmac_zilog.h tty/serial/pmac_zilog: Fix suspend & resume 2011-12-16 11:10:01 +11:00
pnx8xxx_uart.c
pxa.c tty: serial: KGDB support for PXA 2012-10-24 11:38:28 -07:00
sa1100.c ARM: 7342/2: sa1100: prepare for sparse irq conversion 2012-03-25 23:57:20 +01:00
samsung.c serial: samsung: use clk_prepare_enable and clk_disable_unprepare 2012-10-24 11:29:30 -07:00
samsung.h serial: samsung: merge probe() function from all SoC specific extensions 2011-12-23 10:07:00 +09:00
sb1250-duart.c SERIAL: MIPS Swarm sb1250-duart.c driver needs module.h 2012-05-15 17:48:50 +02:00
sc26xx.c serial: Add note about migration to driver SCCNXP 2012-09-05 13:24:40 -07:00
sccnxp.c tty: serial: sccnxp: Fix bug with unterminated platform_id list 2012-10-05 09:34:37 -07:00
serial_core.c TTY: call tty_port_destroy in the rest of drivers 2012-11-15 17:20:58 -08:00
serial_ks8695.c serial: ks8695: use __iomem pointers for MMIO 2012-09-19 15:37:13 +02:00
serial_txx9.c serial: fix serial_txx9.c build warning/typo 2012-06-12 15:41:18 -07:00
sh-sci.c serial: sh-sci: add locking to console write function to avoid SMP lockup 2012-11-15 18:02:51 -08:00
sh-sci.h serial: sh-sci: use serial_port_in/out vs sci_in/out. 2012-03-30 19:50:15 +09:00
sirfsoc_uart.c drivers/tty/serial/sirfsoc_uart.c: drop frees of devm_ alloc'd data 2012-09-05 12:41:57 -07:00
sirfsoc_uart.h serial/sirf: fixup for changes to pin control 2012-02-22 17:59:12 +01:00
sn_console.c Miscellaneous Itanium patches 2012-03-23 17:19:37 -07:00
suncore.c tty: sparc: rename drivers/tty/serial/suncore.h -> include/linux/sunserialcore.h 2012-02-10 10:44:35 -08:00
sunhv.c Disintegrate asm/system.h for Sparc 2012-03-28 18:30:03 +01:00
sunsab.c Disintegrate asm/system.h for Sparc 2012-03-28 18:30:03 +01:00
sunsab.h
sunsu.c serial: diminish usage of struct serial_uart_config 2012-09-05 13:15:07 -07:00
sunzilog.c serial/sunzilog: fix keyboard on SUN SPARCstation 2012-04-04 00:37:10 -07:00
sunzilog.h
timbuart.c TTY: serial: convert drivers/tty/serial/* to use module_platform_driver() 2011-11-30 20:11:46 +09:00
timbuart.h
uartlite.c uartlite: remove IRQF_SAMPLE_RANDOM which is now a no-op 2012-07-19 10:39:42 -04:00
ucc_uart.c serial: Kill off NO_IRQ 2012-01-26 17:14:50 -08:00
vr41xx_siu.c serial: Kill off NO_IRQ 2012-01-26 17:14:50 -08:00
vt8500_serial.c serial: vt8500: fix possible memory leak in vt8500_serial_probe() 2012-10-24 11:34:51 -07:00
xilinx_uartps.c serial: xilinx_uartps: kill CONFIG_OF conditional 2012-11-15 16:58:19 -08:00
zs.c SERIAL: MIPS DECstation zs.c driver needs module.h 2012-05-15 17:48:50 +02:00
zs.h