linux/drivers/pci
Yicong Yang eff3587b9c PCI: Avoid pci_dev_lock() AB/BA deadlock with sriov_numvfs_store()
[ Upstream commit a91ee0e9fc ]

The sysfs sriov_numvfs_store() path acquires the device lock before the
config space access lock:

  sriov_numvfs_store
    device_lock                 # A (1) acquire device lock
    sriov_configure
      vfio_pci_sriov_configure  # (for example)
        vfio_pci_core_sriov_configure
          pci_disable_sriov
            sriov_disable
              pci_cfg_access_lock
                pci_wait_cfg    # B (4) wait for dev->block_cfg_access == 0

Previously, pci_dev_lock() acquired the config space access lock before the
device lock:

  pci_dev_lock
    pci_cfg_access_lock
      dev->block_cfg_access = 1 # B (2) set dev->block_cfg_access = 1
    device_lock                 # A (3) wait for device lock

Any path that uses pci_dev_lock(), e.g., pci_reset_function(), may
deadlock with sriov_numvfs_store() if the operations occur in the sequence
(1) (2) (3) (4).

Avoid the deadlock by reversing the order in pci_dev_lock() so it acquires
the device lock before the config space access lock, the same as the
sriov_numvfs_store() path.

[bhelgaas: combined and adapted commit log from Jay Zhou's independent
subsequent posting:
https://lore.kernel.org/r/20220404062539.1710-1-jianjay.zhou@huawei.com]
Link: https://lore.kernel.org/linux-pci/1583489997-17156-1-git-send-email-yangyicong@hisilicon.com/
Also-posted-by: Jay Zhou <jianjay.zhou@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-06-09 10:20:58 +02:00
..
controller PCI: aardvark: Fix reading MSI interrupt number 2022-05-12 12:25:46 +02:00
endpoint PCI: endpoint: Fix misused goto label 2022-04-13 21:00:59 +02:00
hotplug PCI: pciehp: Add Qualcomm quirk for Command Completed erratum 2022-04-13 21:00:57 +02:00
pcie PCI/portdrv: Enable Bandwidth Notification only if port supports it 2021-09-18 13:40:10 +02:00
switch
access.c PCI: Reduce warnings on possible RW1C corruption 2022-04-08 14:40:19 +02:00
ats.c
bus.c
ecam.c
host-bridge.c
iov.c
irq.c
Kconfig
Makefile
mmap.c
msi.c PCI/MSI: Fix pci_irq_vector()/pci_irq_get_affinity() 2022-01-27 10:54:06 +01:00
of.c PCI: of: Don't fail devm_pci_alloc_host_bridge() on missing 'ranges' 2021-09-22 12:28:02 +02:00
p2pdma.c PCI/P2PDMA: Avoid pci_get_slot(), which may sleep 2021-07-20 16:05:47 +02:00
pci-acpi.c
pci-bridge-emul.c PCI: pci-bridge-emul: Set PCI_STATUS_CAP_LIST for PCIe device 2022-01-27 10:54:26 +01:00
pci-bridge-emul.h PCI: pci-bridge-emul: Add PCIe Root Capabilities Register 2021-09-26 14:08:55 +02:00
pci-driver.c
pci-label.c PCI/sysfs: Fix dsm_label_utf16s_to_utf8s() buffer overrun 2021-07-20 16:05:50 +02:00
pci-mid.c
pci-pf-stub.c
pci-stub.c
pci-sysfs.c
pci.c PCI: Avoid pci_dev_lock() AB/BA deadlock with sriov_numvfs_store() 2022-06-09 10:20:58 +02:00
pci.h PCI: pciehp: Ignore Link Down/Up caused by DPC 2021-07-20 16:05:47 +02:00
probe.c
proc.c
quirks.c PCI: Avoid broken MSI on SB600 USB devices 2022-04-08 14:40:23 +02:00
remove.c
rom.c
search.c
setup-bus.c
setup-irq.c
setup-res.c
slot.c
syscall.c PCI: Return ~0 data on pciconfig_read() CAP_SYS_ADMIN failure 2021-09-18 13:40:10 +02:00
vc.c
vpd.c
xen-pcifront.c