1
0
Fork 0
alistair23-linux/drivers/tty/serial
Peter Zijlstra 870d910e1a serial: pl011: Fix lockdep splat when handling magic-sysrq interrupt
commit 534cf755d9 upstream.

Issuing a magic-sysrq via the PL011 causes the following lockdep splat,
which is easily reproducible under QEMU:

  | sysrq: Changing Loglevel
  | sysrq: Loglevel set to 9
  |
  | ======================================================
  | WARNING: possible circular locking dependency detected
  | 5.9.0-rc7 #1 Not tainted
  | ------------------------------------------------------
  | systemd-journal/138 is trying to acquire lock:
  | ffffab133ad950c0 (console_owner){-.-.}-{0:0}, at: console_lock_spinning_enable+0x34/0x70
  |
  | but task is already holding lock:
  | ffff0001fd47b098 (&port_lock_key){-.-.}-{2:2}, at: pl011_int+0x40/0x488
  |
  | which lock already depends on the new lock.

  [...]

  |  Possible unsafe locking scenario:
  |
  |        CPU0                    CPU1
  |        ----                    ----
  |   lock(&port_lock_key);
  |                                lock(console_owner);
  |                                lock(&port_lock_key);
  |   lock(console_owner);
  |
  |  *** DEADLOCK ***

The issue being that CPU0 takes 'port_lock' on the irq path in pl011_int()
before taking 'console_owner' on the printk() path, whereas CPU1 takes
the two locks in the opposite order on the printk() path due to setting
the "console_owner" prior to calling into into the actual console driver.

Fix this in the same way as the msm-serial driver by dropping 'port_lock'
before handling the sysrq.

Cc: <stable@vger.kernel.org> # 4.19+
Cc: Russell King <linux@armlinux.org.uk>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jirislaby@kernel.org>
Link: https://lore.kernel.org/r/20200811101313.GA6970@willie-the-truck
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Tested-by: Will Deacon <will@kernel.org>
Signed-off-by: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20200930120432.16551-1-will@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2020-11-01 12:01:06 +01:00
..
8250 serial: 8250: 8250_omap: Terminate DMA before pushing data on RX timeout 2020-10-01 13:17:46 +02:00
cpm_uart tty: cpm_uart: drop unused iflag macro 2019-05-24 10:09:16 +02:00
jsm tty: add SPDX identifiers to Kconfig and Makefiles 2019-04-04 18:48:43 +02:00
21285.c
Kconfig tty: serial: earlycon dependency 2020-10-29 09:57:37 +01:00
Makefile TTY/Serial driver changes for 5.4-rc1 2019-09-18 10:50:47 -07:00
altera_jtaguart.c
altera_uart.c
amba-pl010.c
amba-pl011.c serial: pl011: Fix lockdep splat when handling magic-sysrq interrupt 2020-11-01 12:01:06 +01:00
amba-pl011.h
apbuart.c
apbuart.h
ar933x_uart.c serial: ar933x_uart: set UART_CS_{RX,TX}_READY_ORIDE 2020-03-12 13:00:10 +01:00
arc_uart.c
atmel_serial.c tty/serial: atmel: manage shutdown in case of RS485 or ISO7816 mode 2020-02-28 17:22:19 +01:00
atmel_serial.h tty/serial: atmel: add ISO7816 support 2018-10-02 13:38:55 -07:00
bcm63xx_uart.c
clps711x.c serial: clps711x: Remove board support 2019-01-08 16:55:18 +01:00
digicolor-usart.c tty/serial: digicolor: Fix digicolor-usart already registered warning 2019-06-10 19:08:31 +02:00
dz.c
dz.h
earlycon-arm-semihost.c
earlycon-riscv-sbi.c tty/serial: use uart_console_write in the RISC-V SBL early console 2019-01-23 15:41:50 -08:00
earlycon.c
efm32-uart.c
fsl_linflexuart.c tty: serial: linflexuart: Fix magic SysRq handling 2019-10-04 15:02:28 +02:00
fsl_lpuart.c tty: serial: fsl_lpuart: fix lpuart32_poll_get_char 2020-10-29 09:58:10 +01:00
icom.c tty: serial: Remove call to memset after pci_alloc_consistent 2019-09-04 12:43:44 +02:00
icom.h
ifx6x60.c serial: ifx6x60: add missed pm_runtime_disable 2019-12-13 08:42:25 +01:00
ifx6x60.h
imx.c tty: serial: imx: setup the correct sg entry for tx dma 2020-02-28 17:22:19 +01:00
ip22zilog.c
ip22zilog.h
kgdb_nmi.c
kgdboc.c kgdboc: Use a platform device to handle tty drivers showing up late 2020-06-22 09:31:06 +02:00
lantiq.c serial: lantiq: Add support for Lightning Mountain SoC 2019-09-04 12:43:53 +02:00
lpc32xx_hs.c TTY/Serial driver changes for 5.4-rc1 2019-09-18 10:50:47 -07:00
max310x.c serial: max310x: turn off transmitter before activating AutoCTS or auto transmitter flow control 2019-09-05 09:57:44 +02:00
max3100.c
mcf.c
men_z135_uart.c drivers: Remove explicit invocations of mmiowb() 2019-04-08 12:01:02 +01:00
meson_uart.c tty: serial: meson: if no alias specified use an available id 2019-01-18 11:22:22 +01:00
milbeaut_usio.c serial: milbeaut_usio: Fix error handling in probe and remove 2019-04-29 16:20:24 +02:00
mpc52xx_uart.c
mps2-uart.c serial: mps2-uart: Add parentheses around conditional in mps2_uart_shutdown 2019-01-31 19:34:10 +01:00
msm_serial.c tty: serial: msm_serial: Fix lockup for sysrq and oops 2020-01-09 10:20:05 +01:00
mux.c
mvebu-uart.c tty:serial:mvebu-uart:fix a wrong return 2020-03-12 13:00:20 +01:00
mxs-auart.c serial: mxs-auart: add missed iounmap() in probe failure and remove 2020-07-22 09:33:11 +02:00
omap-serial.c
owl-uart.c tty: serial: owl: add "much needed" clk_prepare_enable() 2020-04-29 16:33:14 +02:00
pch_uart.c tty: serial: pch_uart: correct usage of dma_unmap_sg 2020-01-17 19:48:55 +01:00
pic32_uart.c serial: set suppress_bind_attrs flag only if builtin 2018-11-09 09:07:17 -08:00
pic32_uart.h
pmac_zilog.c tty: Use of_node_name_{eq,prefix} for node name comparisons 2018-12-17 16:12:17 +01:00
pmac_zilog.h
pnx8xxx_uart.c
pxa.c
qcom_geni_serial.c serial: qcom_geni_serial: To correct QUP Version detection logic 2020-11-01 12:01:06 +01:00
rda-uart.c tty: serial: rda: Fix the link time qualifier of 'rda_uart_exit()' 2019-10-04 15:01:15 +02:00
rp2.c
sa1100.c serial: sa1100: add note about modem control signals 2019-06-04 12:56:33 +01:00
samsung.c tty: serial: samsung: Correct clock selection logic 2020-10-01 13:18:00 +02:00
samsung.h
sb1250-duart.c
sc16is7xx.c Merge 5.1-rc6 into tty-next 2019-04-21 23:20:08 +02:00
sccnxp.c tty: Remove dev_err() usage after platform_get_irq() 2019-09-04 12:43:49 +02:00
serial-tegra.c serial: tegra: fix CREAD handling for PIO 2020-07-29 10:18:42 +02:00
serial_core.c tty: link tty and port before configuring it as console 2020-01-14 20:08:33 +01:00
serial_mctrl_gpio.c serial: mctrl_gpio: Check for NULL pointer 2019-10-07 13:21:54 +02:00
serial_mctrl_gpio.h serial: mctrl_gpio: Avoid probe failures in case of missing gpiolib 2019-09-04 12:43:50 +02:00
serial_txx9.c drivers: Remove explicit invocations of mmiowb() 2019-04-08 12:01:02 +01:00
sh-sci.c serial: sh-sci: Make sure status register SCxSR is read in correct sequence 2020-04-29 16:33:24 +02:00
sh-sci.h
sifive.c tty: sifive: Finish transmission before changing the clock 2020-10-01 13:17:42 +02:00
sirfsoc_uart.c
sirfsoc_uart.h
sprd_serial.c serial: sprd: Fix a dereference warning 2020-04-02 15:10:59 +02:00
st-asc.c
stm32-usart.c serial: stm32: avoid kernel warning on absence of optional IRQ 2020-09-03 11:27:03 +02:00
stm32-usart.h serial: stm32: add support of RX FIFO threshold 2019-06-21 11:17:36 +02:00
suncore.c tty: Use of_node_name_{eq,prefix} for node name comparisons 2018-12-17 16:12:17 +01:00
sunhv.c sunhv: Fix device naming inconsistency between sunhv_console and sunhv_reg 2019-06-13 14:04:37 -07:00
sunsab.c
sunsab.h
sunsu.c TTY/Serial driver patches for 4.21-rc1 2018-12-28 20:33:54 -08:00
sunzilog.c
sunzilog.h
tegra-tcu.c serial: Add Tegra Combined UART driver 2019-01-30 09:31:31 +01:00
timbuart.c
timbuart.h
uartlite.c serial: uartlite: fix exit path null pointer 2019-10-04 15:02:46 +02:00
ucc_uart.c docs: serial: move it to the driver-api 2019-07-15 11:03:03 -03:00
vr41xx_siu.c
vt8500_serial.c
xilinx_uartps.c serial: uartps: Wait for tx_empty in console setup 2020-10-01 13:17:55 +02:00
zs.c
zs.h