linux-sg2042/drivers
Sergey Senozhatsky 730037c3ee serial: 8250: change lock order in serial8250_do_startup()
We have a number of "uart.port->desc.lock vs desc.lock->uart.port"
lockdep reports coming from 8250 driver; this causes a bit of trouble
to people, so let's fix it.

The problem is reverse lock order in two different call paths:

chain #1:

 serial8250_do_startup()
  spin_lock_irqsave(&port->lock);
   disable_irq_nosync(port->irq);
    raw_spin_lock_irqsave(&desc->lock)

chain #2:

  __report_bad_irq()
   raw_spin_lock_irqsave(&desc->lock)
    for_each_action_of_desc()
     printk()
      spin_lock_irqsave(&port->lock);

Fix this by changing the order of locks in serial8250_do_startup():
 do disable_irq_nosync() first, which grabs desc->lock, and grab
 uart->port after that, so that chain #1 and chain #2 have same lock
 order.

Full lockdep splat:

 ======================================================
 WARNING: possible circular locking dependency detected
 5.4.39 #55 Not tainted
 ======================================================

 swapper/0/0 is trying to acquire lock:
 ffffffffab65b6c0 (console_owner){-...}, at: console_lock_spinning_enable+0x31/0x57

 but task is already holding lock:
 ffff88810a8e34c0 (&irq_desc_lock_class){-.-.}, at: __report_bad_irq+0x5b/0xba

 which lock already depends on the new lock.

 the existing dependency chain (in reverse order) is:

 -> #2 (&irq_desc_lock_class){-.-.}:
        _raw_spin_lock_irqsave+0x61/0x8d
        __irq_get_desc_lock+0x65/0x89
        __disable_irq_nosync+0x3b/0x93
        serial8250_do_startup+0x451/0x75c
        uart_startup+0x1b4/0x2ff
        uart_port_activate+0x73/0xa0
        tty_port_open+0xae/0x10a
        uart_open+0x1b/0x26
        tty_open+0x24d/0x3a0
        chrdev_open+0xd5/0x1cc
        do_dentry_open+0x299/0x3c8
        path_openat+0x434/0x1100
        do_filp_open+0x9b/0x10a
        do_sys_open+0x15f/0x3d7
        kernel_init_freeable+0x157/0x1dd
        kernel_init+0xe/0x105
        ret_from_fork+0x27/0x50

 -> #1 (&port_lock_key){-.-.}:
        _raw_spin_lock_irqsave+0x61/0x8d
        serial8250_console_write+0xa7/0x2a0
        console_unlock+0x3b7/0x528
        vprintk_emit+0x111/0x17f
        printk+0x59/0x73
        register_console+0x336/0x3a4
        uart_add_one_port+0x51b/0x5be
        serial8250_register_8250_port+0x454/0x55e
        dw8250_probe+0x4dc/0x5b9
        platform_drv_probe+0x67/0x8b
        really_probe+0x14a/0x422
        driver_probe_device+0x66/0x130
        device_driver_attach+0x42/0x5b
        __driver_attach+0xca/0x139
        bus_for_each_dev+0x97/0xc9
        bus_add_driver+0x12b/0x228
        driver_register+0x64/0xed
        do_one_initcall+0x20c/0x4a6
        do_initcall_level+0xb5/0xc5
        do_basic_setup+0x4c/0x58
        kernel_init_freeable+0x13f/0x1dd
        kernel_init+0xe/0x105
        ret_from_fork+0x27/0x50

 -> #0 (console_owner){-...}:
        __lock_acquire+0x118d/0x2714
        lock_acquire+0x203/0x258
        console_lock_spinning_enable+0x51/0x57
        console_unlock+0x25d/0x528
        vprintk_emit+0x111/0x17f
        printk+0x59/0x73
        __report_bad_irq+0xa3/0xba
        note_interrupt+0x19a/0x1d6
        handle_irq_event_percpu+0x57/0x79
        handle_irq_event+0x36/0x55
        handle_fasteoi_irq+0xc2/0x18a
        do_IRQ+0xb3/0x157
        ret_from_intr+0x0/0x1d
        cpuidle_enter_state+0x12f/0x1fd
        cpuidle_enter+0x2e/0x3d
        do_idle+0x1ce/0x2ce
        cpu_startup_entry+0x1d/0x1f
        start_kernel+0x406/0x46a
        secondary_startup_64+0xa4/0xb0

 other info that might help us debug this:

 Chain exists of:
   console_owner --> &port_lock_key --> &irq_desc_lock_class

  Possible unsafe locking scenario:

        CPU0                    CPU1
        ----                    ----
   lock(&irq_desc_lock_class);
                                lock(&port_lock_key);
                                lock(&irq_desc_lock_class);
   lock(console_owner);

  *** DEADLOCK ***

 2 locks held by swapper/0/0:
  #0: ffff88810a8e34c0 (&irq_desc_lock_class){-.-.}, at: __report_bad_irq+0x5b/0xba
  #1: ffffffffab65b5c0 (console_lock){+.+.}, at: console_trylock_spinning+0x20/0x181

 stack backtrace:
 CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.4.39 #55
 Hardware name: XXXXXX
 Call Trace:
  <IRQ>
  dump_stack+0xbf/0x133
  ? print_circular_bug+0xd6/0xe9
  check_noncircular+0x1b9/0x1c3
  __lock_acquire+0x118d/0x2714
  lock_acquire+0x203/0x258
  ? console_lock_spinning_enable+0x31/0x57
  console_lock_spinning_enable+0x51/0x57
  ? console_lock_spinning_enable+0x31/0x57
  console_unlock+0x25d/0x528
  ? console_trylock+0x18/0x4e
  vprintk_emit+0x111/0x17f
  ? lock_acquire+0x203/0x258
  printk+0x59/0x73
  __report_bad_irq+0xa3/0xba
  note_interrupt+0x19a/0x1d6
  handle_irq_event_percpu+0x57/0x79
  handle_irq_event+0x36/0x55
  handle_fasteoi_irq+0xc2/0x18a
  do_IRQ+0xb3/0x157
  common_interrupt+0xf/0xf
  </IRQ>

Fixes: 768aec0b5b ("serial: 8250: fix shared interrupts issues with SMP and RT kernels")
Reported-by: Guenter Roeck <linux@roeck-us.net>
Reported-by: Raul Rangel <rrangel@google.com>
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Tested-by: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Petr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/lkml/CAHQZ30BnfX+gxjPm1DUd5psOTqbyDh4EJE=2=VAMW_VDafctkA@mail.gmail.com/T/#u
Link: https://lore.kernel.org/r/20200817022646.1484638-1-sergey.senozhatsky@gmail.com
BugLink: https://bugs.chromium.org/p/chromium/issues/detail?id=1114800
2020-08-18 16:14:01 +02:00
..
accessibility treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
acpi ACPI updates for 5.9-rc1 2020-08-03 20:37:22 -07:00
amba ARM: tegra: Replace zero-length array with flexible-array 2020-06-15 23:08:28 -05:00
android binder: Don't use mmput() from shrinker function. 2020-07-23 09:47:12 +02:00
ata treewide: Remove uninitialized_var() usage 2020-07-16 12:35:15 -07:00
atm Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
auxdisplay treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
base Power management updates for 5.9-rc1 2020-08-03 20:28:08 -07:00
bcma
block Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
bluetooth Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next 2020-06-03 16:27:18 -07:00
bus ARM: SoC DT changes for 5.9 2020-08-03 19:19:34 -07:00
cdrom cdrom: remove the unused cdrom_media_changed function 2020-07-08 16:20:01 -06:00
char ARM: SoC driver updates for v5.9 2020-08-03 19:30:59 -07:00
clk Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
clocksource Time, timers and related driver updates: 2020-08-04 18:17:37 -07:00
connector treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
counter counter: 104-quad-8: Add lock guards - filter clock prescaler 2020-06-14 14:46:52 +01:00
cpufreq Power management updates for 5.9-rc1 2020-08-03 20:28:08 -07:00
cpuidle cpuidle: change enter_s2idle() prototype 2020-07-29 18:38:30 +02:00
crypto Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6 2020-08-03 10:40:14 -07:00
dax block: remove the bd_queue field from struct block_device 2020-07-01 08:08:20 -06:00
dca
devfreq PM / devfreq: Fix the wrong end with semicolon 2020-07-30 17:22:58 +09:00
dio maccess: rename probe_kernel_{read,write} to copy_{from,to}_kernel_nofault 2020-06-17 10:57:41 -07:00
dma ARM: SoC driver updates for v5.9 2020-08-03 19:30:59 -07:00
dma-buf dmabuf: use spinlock to access dmabuf->name 2020-07-10 15:39:29 +05:30
edac 17ed808ad2 ("EDAC: Fix reference count leaks") 2020-08-03 20:01:00 -07:00
eisa treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
extcon extcon: arizona: Fix runtime PM imbalance on error 2020-05-29 17:36:02 +09:00
firewire treewide: Remove uninitialized_var() usage 2020-07-16 12:35:15 -07:00
firmware ARM: SoC driver updates for v5.9 2020-08-03 19:30:59 -07:00
fpga fpga: dfl: fix bug in port reset handshake 2020-07-13 22:11:17 -07:00
fsi treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
gnss treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
gpio Merge remote-tracking branch 'spi/for-5.9' into spi-next 2020-07-29 14:52:00 +01:00
gpu Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
greybus treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
hid Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid into master 2020-07-17 09:43:13 -07:00
hsi treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
hv Drivers: hv: Change flag to write log level in panic msg to false 2020-06-29 10:30:35 +00:00
hwmon Merge branch 'x86/urgent' into x86/cleanups 2020-07-26 19:52:30 +02:00
hwspinlock
hwtracing intel_th: Fix a NULL dereference when hub driver is not loaded 2020-07-10 15:12:48 +02:00
i2c Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
i3c
ide treewide: Remove uninitialized_var() usage 2020-07-16 12:35:15 -07:00
idle Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
iio First set of IIO and counter fixes in the 5.8 cycle. 2020-07-08 09:20:50 +02:00
infiniband dma-mapping updates for 5.9 2020-08-04 17:29:57 -07:00
input Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
interconnect ARM: SoC driver updates for v5.9 2020-08-03 19:30:59 -07:00
iommu dma-mapping updates for 5.9 2020-08-04 17:29:57 -07:00
ipack treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
irqchip The usual boring updates from the interrupt subsystem: 2020-08-04 18:11:58 -07:00
isdn treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
leds ARM: s3c24xx: leds: Convert to use GPIO descriptors 2020-07-09 09:56:14 +02:00
lightnvm block: rename generic_make_request to submit_bio_noacct 2020-07-01 07:27:24 -06:00
macintosh dma-mapping: make support for dma ops optional 2020-07-19 09:29:23 +02:00
mailbox mailbox: qcom: Add ipq6018 apcs compatible 2020-06-10 22:43:57 -05:00
mcb
md Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
media treewide: Remove uninitialized_var() usage 2020-07-16 12:35:15 -07:00
memory Power management updates for 5.9-rc1 2020-08-03 20:28:08 -07:00
memstick treewide: Remove uninitialized_var() usage 2020-07-16 12:35:15 -07:00
message scsi: mptfusion: Don't use GFP_ATOMIC for larger DMA allocations 2020-06-26 22:51:53 -04:00
mfd irqdomain/treewide: Free firmware node after domain removal 2020-07-23 00:08:52 +02:00
misc dma-mapping updates for 5.9 2020-08-04 17:29:57 -07:00
mmc Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
most
mtd Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
mux
net Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
nfc nfc: s3fwrn5: add missing release on skb in s3fwrn5_recv_frame 2020-07-20 18:31:33 -07:00
ntb NTB: perf: Fix race condition when run with ntb_test 2020-06-05 20:02:09 -04:00
nubus
nvdimm for-5.9/block-20200802 2020-08-03 11:57:03 -07:00
nvme for-5.9/block-20200802 2020-08-03 11:57:03 -07:00
nvmem
of of/irq: Make of_msi_map_rid() PCI bus agnostic 2020-07-28 15:51:32 +01:00
opp Merge branches 'pm-em' and 'pm-core' 2020-08-03 13:11:39 +02:00
oprofile oprofile: Replace zero-length array with flexible-array 2020-06-15 23:08:32 -05:00
parisc
parport treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
pci Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
pcmcia treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
perf arm64 and cross-arch updates for 5.9: 2020-08-03 14:11:08 -07:00
phy phy: fixes for 5.8 2020-07-08 18:00:07 +02:00
pinctrl A single patch to the Qualcomm driver fixing missing dual 2020-08-01 10:11:42 -07:00
platform Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
pnp treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
power power supply and reset changes for the v5.8 series 2020-06-10 11:28:35 -07:00
powercap powercap: Add Power Limit4 support 2020-07-27 14:17:36 +02:00
pps treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
ps3
ptp treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
pwm pwm: remove pwm-puv3 driver 2020-07-01 12:10:51 +03:00
rapidio rapidio: Replace zero-length array with flexible-array 2020-06-15 23:08:32 -05:00
ras
regulator Merge remote-tracking branch 'regulator/for-5.9' into regulator-next 2020-07-30 23:27:08 +01:00
remoteproc remoteproc updates for v5.8 2020-06-08 13:01:08 -07:00
reset SOC: TI Keystone driver update for v5.9 2020-07-27 14:24:51 +02:00
rpmsg remoteproc updates for v5.8 2020-06-08 13:01:08 -07:00
rtc rtc: remove fb-puv3 driver 2020-07-01 12:10:59 +03:00
s390 tasklets API update for v5.9-rc1 2020-08-04 13:40:35 -07:00
sbus treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
scsi Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
sfi treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
sh
siox
slimbus
soc ARM: SoC driver updates for v5.9 2020-08-03 19:30:59 -07:00
soundwire soundwire: intel: fix memory leak with devm_kasprintf 2020-06-22 17:15:20 +05:30
spi Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
spmi
ssb treewide: Remove uninitialized_var() usage 2020-07-16 12:35:15 -07:00
staging tasklets API update for v5.9-rc1 2020-08-04 13:40:35 -07:00
target Kbuild updates for v5.8 (2nd) 2020-06-13 13:29:16 -07:00
tc
tee Enable multi-stage OP-TEE bus enumeration 2020-07-13 15:11:44 +02:00
thermal Merge branches 'pm-em' and 'pm-core' 2020-08-03 13:11:39 +02:00
thunderbolt thunderbolt: Fix path indices used in USB3 tunnel discovery 2020-06-25 15:45:30 +03:00
tty serial: 8250: change lock order in serial8250_do_startup() 2020-08-18 16:14:01 +02:00
uio uio_pdrv_genirq: fix use without device tree and no interrupt 2020-07-03 10:52:02 +02:00
usb Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
vdpa dma-mapping: make support for dma ops optional 2020-07-19 09:29:23 +02:00
vfio vfio/pci: fix racy on error and request eventfd ctx 2020-07-17 08:28:40 -06:00
vhost Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
video Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
virt virt: vbox: Fix guest capabilities mask check 2020-07-10 13:40:19 +02:00
virtio Remove uninitialized_var() macro for v5.9-rc1 2020-08-04 13:49:43 -07:00
visorbus treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
vlynq
vme treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
w1 w1: Replace zero-length array with flexible-array 2020-06-15 23:08:32 -05:00
watchdog treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
xen dma-mapping: make support for dma ops optional 2020-07-19 09:29:23 +02:00
zorro treewide: replace '---help---' in Kconfig files with 'help' 2020-06-14 01:57:21 +09:00
Kconfig
Makefile