浏览代码

Revert "PCI: Use hotplug-safe pci_get_domain_bus_and_slot()"

This reverts commit 433efd2247b0cbf5e7e86275e1f21281d3b99047.

When we remove an SR-IOV device, we have this call chain:

    driver .remove() method
        pci_disable_sriov()
            sriov_disable()
                virtfn_remove()
                    pci_get_domain_bus_and_slot()

sriov_disable() is only called for PFs, not for VFs.  When it's called
for a PF, it loops through all the VFs and calls virtfn_remove() for
each.  But we stop and remove VFs before PFs, so by the time we get
to virtfn_remove(), the VFs have already been stopped and deleted
from the device list.  Now pci_get_domain_bus_and_slot(), which uses
bus_find_device() and relies on that device list, doesn't find the
VFs, so the VF references aren't released correctly.

Reported-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Bjorn Helgaas 12 年之前
父节点
当前提交
94bb346480
共有 1 个文件被更改,包括 6 次插入2 次删除
  1. 6 2
      drivers/pci/iov.c

+ 6 - 2
drivers/pci/iov.c

@@ -152,11 +152,15 @@ failed1:
 static void virtfn_remove(struct pci_dev *dev, int id, int reset)
 {
 	char buf[VIRTFN_ID_LEN];
+	struct pci_bus *bus;
 	struct pci_dev *virtfn;
 	struct pci_sriov *iov = dev->sriov;
 
-	virtfn = pci_get_domain_bus_and_slot(pci_domain_nr(dev->bus),
-			virtfn_bus(dev, id), virtfn_devfn(dev, id));
+	bus = pci_find_bus(pci_domain_nr(dev->bus), virtfn_bus(dev, id));
+	if (!bus)
+		return;
+
+	virtfn = pci_get_slot(bus, virtfn_devfn(dev, id));
 	if (!virtfn)
 		return;