Message ID | 20200615143250.438252-3-ian.may@canonical.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Bjorn Helgaas |
Headers | show |
Series | Hotplug interrupt and AER recovery deadlocks | expand |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e32c5a1a706e..4eeca8b18664 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -5229,6 +5229,7 @@ static int pci_slot_reset(struct pci_slot *slot, int probe) if (!probe) { + mutex_unlock(&pci_slot_mutex); slot->hotplug->ops->reset_lock(slot->hotplug); pci_slot_lock(slot); } @@ -5241,6 +5242,7 @@ static int pci_slot_reset(struct pci_slot *slot, int probe) { pci_slot_unlock(slot); slot->hotplug->ops->reset_unlock(slot->hotplug); + mutex_lock(&pci_slot_mutex); } return rc;
In the AER recovery code path, pci_bus_error_reset acquires the pci_slot_mutex, unlock and relock in call to pci_slot_reset around controller reset to lock in same order as the hotplug code path. Hotplug AER ---------------------------- --------------------------- down_read(&ctrl->reset_lock) mutex_lock(&pci_slot_mutex) mutex_lock(&pci_slot_mutex) down_write(&ctrl->reset_lock) Signed-off-by: Ian May <ian.may@canonical.com> --- drivers/pci/pci.c | 2 ++ 1 file changed, 2 insertions(+)