mirror-linux/drivers/pci/controller
Johan Hovold 1e56086415 PCI/ASPM: Fix deadlock when enabling ASPM
A last minute revert in 6.7-final introduced a potential deadlock when
enabling ASPM during probe of Qualcomm PCIe controllers as reported by
lockdep:

  ============================================
  WARNING: possible recursive locking detected
  6.7.0 #40 Not tainted
  --------------------------------------------
  kworker/u16:5/90 is trying to acquire lock:
  ffffacfa78ced000 (pci_bus_sem){++++}-{3:3}, at: pcie_aspm_pm_state_change+0x58/0xdc

              but task is already holding lock:
  ffffacfa78ced000 (pci_bus_sem){++++}-{3:3}, at: pci_walk_bus+0x34/0xbc

              other info that might help us debug this:
   Possible unsafe locking scenario:

         CPU0
         ----
    lock(pci_bus_sem);
    lock(pci_bus_sem);

               *** DEADLOCK ***

  Call trace:
   print_deadlock_bug+0x25c/0x348
   __lock_acquire+0x10a4/0x2064
   lock_acquire+0x1e8/0x318
   down_read+0x60/0x184
   pcie_aspm_pm_state_change+0x58/0xdc
   pci_set_full_power_state+0xa8/0x114
   pci_set_power_state+0xc4/0x120
   qcom_pcie_enable_aspm+0x1c/0x3c [pcie_qcom]
   pci_walk_bus+0x64/0xbc
   qcom_pcie_host_post_init_2_7_0+0x28/0x34 [pcie_qcom]

The deadlock can easily be reproduced on machines like the Lenovo ThinkPad
X13s by adding a delay to increase the race window during asynchronous
probe where another thread can take a write lock.

Add a new pci_set_power_state_locked() and associated helper functions that
can be called with the PCI bus semaphore held to avoid taking the read lock
twice.

Link: https://lore.kernel.org/r/ZZu0qx2cmn7IwTyQ@hovoldconsulting.com
Link: https://lore.kernel.org/r/20240130100243.11011-1-johan+linaro@kernel.org
Fixes: f93e71aea6 ("Revert "PCI/ASPM: Remove pcie_aspm_pm_state_change()"")
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: <stable@vger.kernel.org>	# 6.7
2024-01-31 09:03:51 -06:00
..
cadence Merge branch 'pci/irq-clean-up' 2024-01-15 12:10:40 -06:00
dwc PCI/ASPM: Fix deadlock when enabling ASPM 2024-01-31 09:03:51 -06:00
mobiveil PCI: Use PCI_HEADER_TYPE_* instead of literals 2023-10-03 11:55:59 -05:00
Kconfig PCI: xilinx-xdma: Add Xilinx XDMA Root Port driver 2023-10-26 15:02:02 +00:00
Makefile PCI: xilinx-xdma: Add Xilinx XDMA Root Port driver 2023-10-26 15:02:02 +00:00
pci-aardvark.c PCI: aardvark: Convert to platform remove callback returning void 2023-06-24 14:10:09 +00:00
pci-ftpci100.c PCI: Explicitly include correct DT includes 2023-07-18 14:33:17 -05:00
pci-host-common.c PCI: host-generic: Convert to platform remove callback returning void 2023-11-20 15:53:14 -06:00
pci-host-generic.c PCI: host-generic: Convert to platform remove callback returning void 2023-11-20 15:53:14 -06:00
pci-hyperv-intf.c
pci-hyperv.c x86/apic: Drop apic::delivery_mode 2023-11-21 16:58:54 +01:00
pci-ixp4xx.c PCI: Explicitly include correct DT includes 2023-07-18 14:33:17 -05:00
pci-loongson.c PCI: loongson: Limit MRRS to 256 2023-12-08 10:48:37 -06:00
pci-mvebu.c PCI: mvebu: Use FIELD_PREP() with Link Width 2023-10-10 15:00:52 -05:00
pci-rcar-gen2.c PCI: rcar-gen2: Use devm_platform_get_and_ioremap_resource() 2023-07-13 18:12:35 +00:00
pci-tegra.c PCI: tegra: Convert to platform remove callback returning void 2023-06-24 14:14:02 +00:00
pci-thunder-ecam.c
pci-thunder-pem.c
pci-v3-semi.c Merge branch 'pci/misc' 2023-08-29 11:03:57 -05:00
pci-versatile.c PCI: Remove MODULE_LICENSE so boolean drivers don't look like modules 2023-02-17 08:47:58 -06:00
pci-xgene-msi.c PCI: xgene-msi: Use devm_platform_get_and_ioremap_resource() 2023-07-13 18:12:36 +00:00
pci-xgene.c PCI: xgene: Do PCI error check on own line & keep return value 2023-10-10 16:40:18 -05:00
pcie-altera-msi.c PCI: altera-msi: Convert to platform remove callback returning void 2023-06-24 14:10:47 +00:00
pcie-altera.c PCI: Explicitly include correct DT includes 2023-07-18 14:33:17 -05:00
pcie-apple.c Merge branch 'pci/misc' 2023-08-29 11:03:57 -05:00
pcie-brcmstb.c PCI: brcmstb: Configure HW CLKREQ# mode appropriate for downstream device 2024-01-11 11:53:00 +00:00
pcie-hisi-error.c PCI: hisi-error: Convert to platform remove callback returning void 2023-06-24 14:12:13 +00:00
pcie-iproc-bcma.c
pcie-iproc-msi.c PCI: iproc: Use of_property_read_bool() for boolean properties 2023-07-13 18:09:24 +00:00
pcie-iproc-platform.c PCI: iproc: Fix -Wvoid-pointer-to-enum-cast warning 2024-01-06 08:06:50 +00:00
pcie-iproc.c PCI: Use PCI_HEADER_TYPE_* instead of literals 2023-10-03 11:55:59 -05:00
pcie-iproc.h PCI: iproc: Convert to platform remove callback returning void 2023-06-24 14:12:36 +00:00
pcie-mediatek-gen3.c PCI: mediatek-gen3: Fix translation window size calculation 2024-01-09 16:42:22 -06:00
pcie-mediatek.c PCI: mediatek: Clear interrupt status before dispatching handler 2024-01-09 16:41:23 -06:00
pcie-microchip-host.c Merge branch 'pci/controller/remove-void-cast' 2023-08-29 11:03:56 -05:00
pcie-mt7621.c PCI: mt7621: Convert to platform remove callback returning void 2023-06-24 14:13:16 +00:00
pcie-rcar-ep.c PCI: endpoint: Drop PCI_EPC_IRQ_XXX definitions 2023-12-18 11:55:56 +01:00
pcie-rcar-host.c PCI: rcar-host: Add support for optional regulators 2023-12-14 19:10:16 +00:00
pcie-rcar.c
pcie-rcar.h PCI: rcar: Avoid defines prefixed with CONFIG 2023-03-10 13:34:27 +01:00
pcie-rockchip-ep.c PCI: rockchip-ep: Use INTX instead of legacy 2023-12-19 09:36:42 +01:00
pcie-rockchip-host.c PCI: rockchip-host: Rename rockchip_pcie_legacy_int_handler() 2023-12-19 09:36:42 +01:00
pcie-rockchip.c PCI: Explicitly include correct DT includes 2023-07-18 14:33:17 -05:00
pcie-rockchip.h PCI: rockchip: Use 64-bit mask on MSI 64-bit PCI address 2023-07-13 18:25:44 +00:00
pcie-xilinx-common.h PCI: xilinx-xdma: Add Xilinx XDMA Root Port driver 2023-10-26 15:02:02 +00:00
pcie-xilinx-cpm.c PCI: xilinx-cpm: Move IRQ definitions to a common header 2023-10-26 14:10:42 +00:00
pcie-xilinx-dma-pl.c PCI: xilinx-xdma: Fix error code in xilinx_pl_dma_pcie_init_irq_domain() 2024-01-08 17:44:45 +00:00
pcie-xilinx-nwl.c PCI: xilinx-nwl: Use INTX instead of legacy 2023-12-19 09:36:42 +01:00
pcie-xilinx.c
vmd.c pci-v6.8-changes 2024-01-17 16:23:17 -08:00