diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2023-04-20 16:16:33 -0500 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2023-04-20 16:16:33 -0500 |
commit | 8745c3d542769c93fe6c88ffc927f02ce7cc0085 (patch) | |
tree | aa8c4932222db32ed34d4a4f63eb2c9675631cc8 /drivers/pci | |
parent | 66d3d0d0e860f06ec40304e792c2270e70617008 (diff) | |
parent | f5eff5591b8f9c5effd25c92c758a127765f74c1 (diff) |
Merge branch 'pci/hotplug'
- Fix pciehp AB-BA deadlock between reset_lock and device_lock (Lukas
Wunner)
* pci/hotplug:
PCI: pciehp: Fix AB-BA deadlock between reset_lock and device_lock
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/hotplug/pciehp_pci.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/pci/hotplug/pciehp_pci.c b/drivers/pci/hotplug/pciehp_pci.c index d17f3bf36f70..ad12515a4a12 100644 --- a/drivers/pci/hotplug/pciehp_pci.c +++ b/drivers/pci/hotplug/pciehp_pci.c @@ -63,7 +63,14 @@ int pciehp_configure_device(struct controller *ctrl) pci_assign_unassigned_bridge_resources(bridge); pcie_bus_configure_settings(parent); + + /* + * Release reset_lock during driver binding + * to avoid AB-BA deadlock with device_lock. + */ + up_read(&ctrl->reset_lock); pci_bus_add_devices(parent); + down_read_nested(&ctrl->reset_lock, ctrl->depth); out: pci_unlock_rescan_remove(); @@ -104,7 +111,15 @@ void pciehp_unconfigure_device(struct controller *ctrl, bool presence) list_for_each_entry_safe_reverse(dev, temp, &parent->devices, bus_list) { pci_dev_get(dev); + + /* + * Release reset_lock during driver unbinding + * to avoid AB-BA deadlock with device_lock. + */ + up_read(&ctrl->reset_lock); pci_stop_and_remove_bus_device(dev); + down_read_nested(&ctrl->reset_lock, ctrl->depth); + /* * Ensure that no new Requests will be generated from * the device. |