aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/controller/vmd.c
diff options
context:
space:
mode:
authorJon Derrick <jonathan.derrick@intel.com>2018-10-15 20:48:07 -0400
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>2018-10-18 12:21:14 -0400
commitdc8af3a827df6d4bb925d3b81b7ec94a7cce9482 (patch)
tree4040c3bb37abce1bd573431d07671b2ffe286455 /drivers/pci/controller/vmd.c
parent7876320f88802b22d4e2daf7eb027dd14175a0f8 (diff)
PCI: vmd: Detach resources after stopping root bus
The VMD removal path calls pci_stop_root_busi(), which tears down the pcie tree, including detaching all of the attached drivers. During driver detachment, devices may use pci_release_region() to release resources. This path relies on the resource being accessible in resource tree. By detaching the child domain from the parent resource domain prior to stopping the bus, we are preventing the list traversal from finding the resource to be freed. If we instead detach the resource after stopping the bus, we will have properly freed the resource and detaching is simply accounting at that point. Without this order, the resource is never freed and is orphaned on VMD removal, leading to a warning: [ 181.940162] Trying to free nonexistent resource <e5a10000-e5a13fff> Fixes: 2c2c5c5cd213 ("x86/PCI: VMD: Attach VMD resources to parent domain's resource tree") Signed-off-by: Jon Derrick <jonathan.derrick@intel.com> [lorenzo.pieralisi@arm.com: updated commit log] Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Reviewed-by: Keith Busch <keith.busch@intel.com>
Diffstat (limited to 'drivers/pci/controller/vmd.c')
-rw-r--r--drivers/pci/controller/vmd.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
index fd2dbd7eed7b..46ed80f66386 100644
--- a/drivers/pci/controller/vmd.c
+++ b/drivers/pci/controller/vmd.c
@@ -813,12 +813,12 @@ static void vmd_remove(struct pci_dev *dev)
813{ 813{
814 struct vmd_dev *vmd = pci_get_drvdata(dev); 814 struct vmd_dev *vmd = pci_get_drvdata(dev);
815 815
816 vmd_detach_resources(vmd);
817 sysfs_remove_link(&vmd->dev->dev.kobj, "domain"); 816 sysfs_remove_link(&vmd->dev->dev.kobj, "domain");
818 pci_stop_root_bus(vmd->bus); 817 pci_stop_root_bus(vmd->bus);
819 pci_remove_root_bus(vmd->bus); 818 pci_remove_root_bus(vmd->bus);
820 vmd_cleanup_srcu(vmd); 819 vmd_cleanup_srcu(vmd);
821 vmd_teardown_dma_ops(vmd); 820 vmd_teardown_dma_ops(vmd);
821 vmd_detach_resources(vmd);
822 irq_domain_remove(vmd->irq_domain); 822 irq_domain_remove(vmd->irq_domain);
823} 823}
824 824