aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/xen/xen-pciback/vpci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/xen/xen-pciback/vpci.c')
-rw-r--r--drivers/xen/xen-pciback/vpci.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/xen/xen-pciback/vpci.c b/drivers/xen/xen-pciback/vpci.c
index 51afff96c515..c99f8bb1c56c 100644
--- a/drivers/xen/xen-pciback/vpci.c
+++ b/drivers/xen/xen-pciback/vpci.c
@@ -145,7 +145,7 @@ out:
145} 145}
146 146
147static void __xen_pcibk_release_pci_dev(struct xen_pcibk_device *pdev, 147static void __xen_pcibk_release_pci_dev(struct xen_pcibk_device *pdev,
148 struct pci_dev *dev) 148 struct pci_dev *dev, bool lock)
149{ 149{
150 int slot; 150 int slot;
151 struct vpci_dev_data *vpci_dev = pdev->pci_dev_data; 151 struct vpci_dev_data *vpci_dev = pdev->pci_dev_data;
@@ -169,8 +169,13 @@ static void __xen_pcibk_release_pci_dev(struct xen_pcibk_device *pdev,
169out: 169out:
170 mutex_unlock(&vpci_dev->lock); 170 mutex_unlock(&vpci_dev->lock);
171 171
172 if (found_dev) 172 if (found_dev) {
173 if (lock)
174 device_lock(&found_dev->dev);
173 pcistub_put_pci_dev(found_dev); 175 pcistub_put_pci_dev(found_dev);
176 if (lock)
177 device_unlock(&found_dev->dev);
178 }
174} 179}
175 180
176static int __xen_pcibk_init_devices(struct xen_pcibk_device *pdev) 181static int __xen_pcibk_init_devices(struct xen_pcibk_device *pdev)
@@ -208,8 +213,11 @@ static void __xen_pcibk_release_devices(struct xen_pcibk_device *pdev)
208 struct pci_dev_entry *e, *tmp; 213 struct pci_dev_entry *e, *tmp;
209 list_for_each_entry_safe(e, tmp, &vpci_dev->dev_list[slot], 214 list_for_each_entry_safe(e, tmp, &vpci_dev->dev_list[slot],
210 list) { 215 list) {
216 struct pci_dev *dev = e->dev;
211 list_del(&e->list); 217 list_del(&e->list);
212 pcistub_put_pci_dev(e->dev); 218 device_lock(&dev->dev);
219 pcistub_put_pci_dev(dev);
220 device_unlock(&dev->dev);
213 kfree(e); 221 kfree(e);
214 } 222 }
215 } 223 }