summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJoerg Roedel <jroedel@suse.de>2019-09-25 15:22:58 +0200
committerJoerg Roedel <jroedel@suse.de>2019-09-28 14:43:58 +0200
commit45e528d9c479aeef2d3d1db1e619b243f91e324f (patch)
tree4e25b8515f6b8319e6951ea5c4ea87afc050f22b /drivers
parentiommu/amd: Take domain->lock for complete attach/detach path (diff)
downloadlinux-45e528d9c479aeef2d3d1db1e619b243f91e324f.tar.xz
linux-45e528d9c479aeef2d3d1db1e619b243f91e324f.zip
iommu/amd: Check for busy devices earlier in attach_device()
Check early in attach_device whether the device is already attached to a domain. This also simplifies the code path so that __attach_device() can be removed. Fixes: 92d420ec028d ("iommu/amd: Relax locking in dma_ops path") Reviewed-by: Filippo Sironi <sironi@amazon.de> Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/iommu/amd_iommu.c25
1 files changed, 7 insertions, 18 deletions
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
index 2919168577ff..459247c32dc0 100644
--- a/drivers/iommu/amd_iommu.c
+++ b/drivers/iommu/amd_iommu.c
@@ -2072,23 +2072,6 @@ static void do_detach(struct iommu_dev_data *dev_data)
domain->dev_cnt -= 1;
}
-/*
- * If a device is not yet associated with a domain, this function makes the
- * device visible in the domain
- */
-static int __attach_device(struct iommu_dev_data *dev_data,
- struct protection_domain *domain)
-{
- if (dev_data->domain != NULL)
- return -EBUSY;
-
- /* Attach alias group root */
- do_attach(dev_data, domain);
-
- return 0;
-}
-
-
static void pdev_iommuv2_disable(struct pci_dev *pdev)
{
pci_disable_ats(pdev);
@@ -2174,6 +2157,10 @@ static int attach_device(struct device *dev,
dev_data = get_dev_data(dev);
+ ret = -EBUSY;
+ if (dev_data->domain != NULL)
+ goto out;
+
if (!dev_is_pci(dev))
goto skip_ats_check;
@@ -2198,7 +2185,9 @@ static int attach_device(struct device *dev,
}
skip_ats_check:
- ret = __attach_device(dev_data, domain);
+ ret = 0;
+
+ do_attach(dev_data, domain);
/*
* We might boot into a crash-kernel here. The crashed kernel