Patchwork [RFC,v1,13/22] PCI: make each PCI device hold a reference to its parent PCI bus

login
register
mail settings
Submitter Jiang Liu
Date Aug. 7, 2012, 4:10 p.m.
Message ID <1344355862-2726-14-git-send-email-jiang.liu@huawei.com>
Download mbox | patch
Permalink /patch/175712/
State Not Applicable
Headers show

Comments

Jiang Liu - Aug. 7, 2012, 4:10 p.m.
Make each PCI device hold a reference to its parent PCI bus, so it won't
cause invalid memory access when doing:
pci_bus_lock_states(dev->bus, PCI_BUS_STATE_xxxx);

Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 drivers/pci/iov.c    |    3 ++-
 drivers/pci/probe.c  |    2 +-
 drivers/pci/remove.c |    1 +
 3 files changed, 4 insertions(+), 2 deletions(-)

Patch

diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index c7d2969..40f5f52 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -92,7 +92,8 @@  static int virtfn_add(struct pci_dev *dev, int id, int reset)
 		kfree(virtfn);
 		mutex_unlock(&iov->dev->sriov->lock);
 		return -ENOMEM;
-	}
+	} else
+		pci_bus_get(virtfn->bus);
 	virtfn->devfn = virtfn_devfn(dev, id);
 	virtfn->vendor = dev->vendor;
 	pci_read_config_word(dev, iov->pos + PCI_SRIOV_VF_DID, &virtfn->device);
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index e6b40d0..47bf071 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1272,7 +1272,7 @@  static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
 	if (!dev)
 		return NULL;
 
-	dev->bus = bus;
+	dev->bus = pci_bus_get(bus);
 	dev->devfn = devfn;
 	dev->vendor = l & 0xffff;
 	dev->device = (l >> 16) & 0xffff;
diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c
index a26a841..0d947c0 100644
--- a/drivers/pci/remove.c
+++ b/drivers/pci/remove.c
@@ -43,6 +43,7 @@  static void pci_destroy_dev(struct pci_dev *dev)
 		dev->bus_list.next = dev->bus_list.prev = NULL;
 		up_write(&pci_bus_sem);
 		pci_free_resources(dev);
+		pci_bus_put(dev->bus);
 		put_device(&dev->dev);
 	}
 }