iommu/amd: Improve amd_iommu_release_device()
authorVasant Hegde <vasant.hegde@amd.com>
Wed, 30 Oct 2024 06:35:56 +0000 (06:35 +0000)
committerJoerg Roedel <jroedel@suse.de>
Wed, 30 Oct 2024 10:06:48 +0000 (11:06 +0100)
Previous patch added ops->release_domain support. Core will attach
devices to release_domain->attach_dev() before calling this function.
Devices are already detached their current domain and attached to
blocked domain.

This is mostly dummy function now. Just throw warning if device is still
attached to domain.

Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/20241030063556.6104-13-vasant.hegde@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/amd/iommu.c

index fd39b54..5ce8e65 100644 (file)
@@ -77,8 +77,6 @@ DEFINE_IDA(pdom_ids);
 
 struct kmem_cache *amd_iommu_irq_cache;
 
-static void detach_device(struct device *dev);
-
 static int amd_iommu_attach_device(struct iommu_domain *dom,
                                   struct device *dev);
 
@@ -563,22 +561,6 @@ static void iommu_ignore_device(struct amd_iommu *iommu, struct device *dev)
        setup_aliases(iommu, dev);
 }
 
-static void amd_iommu_uninit_device(struct device *dev)
-{
-       struct iommu_dev_data *dev_data;
-
-       dev_data = dev_iommu_priv_get(dev);
-       if (!dev_data)
-               return;
-
-       if (dev_data->domain)
-               detach_device(dev);
-
-       /*
-        * We keep dev_data around for unplugged devices and reuse it when the
-        * device is re-plugged - not doing so would introduce a ton of races.
-        */
-}
 
 /****************************************************************************
  *
@@ -2249,17 +2231,14 @@ out_err:
 
 static void amd_iommu_release_device(struct device *dev)
 {
-       struct amd_iommu *iommu;
-
-       if (!check_device(dev))
-               return;
+       struct iommu_dev_data *dev_data = dev_iommu_priv_get(dev);
 
-       iommu = rlookup_amd_iommu(dev);
-       if (!iommu)
-               return;
+       WARN_ON(dev_data->domain);
 
-       amd_iommu_uninit_device(dev);
-       iommu_completion_wait(iommu);
+       /*
+        * We keep dev_data around for unplugged devices and reuse it when the
+        * device is re-plugged - not doing so would introduce a ton of races.
+        */
 }
 
 static struct iommu_group *amd_iommu_device_group(struct device *dev)