iommu: Use __iommu_group_set_domain() for __iommu_attach_group()
authorJason Gunthorpe <jgg@nvidia.com>
Thu, 11 May 2023 04:42:02 +0000 (01:42 -0300)
committerJoerg Roedel <jroedel@suse.de>
Tue, 23 May 2023 06:15:52 +0000 (08:15 +0200)
The error recovery here matches the recovery inside
__iommu_group_set_domain(), so just use it directly.

Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Tested-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/4-v5-1b99ae392328+44574-iommu_err_unwind_jgg@nvidia.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/iommu.c

index 74cb162daac3528300354300cf1b1b1107475031..f31ba66ccb2f409ea5972d11a4f442dbbbc34ca2 100644 (file)
@@ -2159,52 +2159,14 @@ struct iommu_domain *iommu_get_dma_domain(struct device *dev)
        return dev->iommu_group->default_domain;
 }
 
-/*
- * IOMMU groups are really the natural working unit of the IOMMU, but
- * the IOMMU API works on domains and devices.  Bridge that gap by
- * iterating over the devices in a group.  Ideally we'd have a single
- * device which represents the requestor ID of the group, but we also
- * allow IOMMU drivers to create policy defined minimum sets, where
- * the physical hardware may be able to distiguish members, but we
- * wish to group them at a higher level (ex. untrusted multi-function
- * PCI devices).  Thus we attach each device.
- */
-static int iommu_group_do_attach_device(struct device *dev, void *data)
-{
-       struct iommu_domain *domain = data;
-
-       return __iommu_attach_device(domain, dev);
-}
-
 static int __iommu_attach_group(struct iommu_domain *domain,
                                struct iommu_group *group)
 {
-       int ret;
-
        if (group->domain && group->domain != group->default_domain &&
            group->domain != group->blocking_domain)
                return -EBUSY;
 
-       ret = __iommu_group_for_each_dev(group, domain,
-                                        iommu_group_do_attach_device);
-       if (ret == 0) {
-               group->domain = domain;
-       } else {
-               /*
-                * To recover from the case when certain device within the
-                * group fails to attach to the new domain, we need force
-                * attaching all devices back to the old domain. The old
-                * domain is compatible for all devices in the group,
-                * hence the iommu driver should always return success.
-                */
-               struct iommu_domain *old_domain = group->domain;
-
-               group->domain = NULL;
-               WARN(__iommu_group_set_domain(group, old_domain),
-                    "iommu driver failed to attach a compatible domain");
-       }
-
-       return ret;
+       return __iommu_group_set_domain(group, domain);
 }
 
 /**