diff options
author | Lukas Wunner <lukas@wunner.de> | 2020-07-21 14:24:51 +0300 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2020-09-18 00:25:45 +0300 |
commit | 10791141a6cfc96eecf578fb1240f191ac112e02 (patch) | |
tree | 7cb0cef263cc4598b705088c6b3aca30da70d828 | |
parent | 8c46d543aaa900942365b2b46a165fb49e939954 (diff) | |
download | linux-10791141a6cfc96eecf578fb1240f191ac112e02.tar.xz |
PCI: Simplify pci_dev_reset_slot_function()
pci_dev_reset_slot_function() refuses to reset a hotplug slot if it is
shared by multiple pci_devs. That's the case if and only if the slot is
occupied by a multifunction device.
Simplify the function to check the device's multifunction flag instead
of iterating over the devices on the bus. (Iterating over the devices
requires holding pci_bus_sem, which the function erroneously does not
acquire.)
Link: https://lore.kernel.org/r/c6aab5af096f7b1b3db57f6335cebba8f0fcca89.1595330431.git.lukas@wunner.de
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: Alex Williamson <alex.williamson@redhat.com>
-rw-r--r-- | drivers/pci/pci.c | 8 |
1 files changed, 1 insertions, 7 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 84b993714a91..b630d53e998a 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -4917,16 +4917,10 @@ static int pci_reset_hotplug_slot(struct hotplug_slot *hotplug, int probe) static int pci_dev_reset_slot_function(struct pci_dev *dev, int probe) { - struct pci_dev *pdev; - - if (dev->subordinate || !dev->slot || + if (dev->multifunction || dev->subordinate || !dev->slot || dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET) return -ENOTTY; - list_for_each_entry(pdev, &dev->bus->devices, bus_list) - if (pdev != dev && pdev->slot == dev->slot) - return -ENOTTY; - return pci_reset_hotplug_slot(dev->slot->hotplug, probe); } |