]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu: Put domain allocation in __iommu_group_alloc_blocking_domain()
authorJason Gunthorpe <jgg@nvidia.com>
Mon, 28 Oct 2024 09:38:09 +0000 (09:38 +0000)
committerJoerg Roedel <jroedel@suse.de>
Tue, 29 Oct 2024 09:08:23 +0000 (10:08 +0100)
There is no longer a reason to call __iommu_domain_alloc() to allocate
the blocking domain. All drivers that support a native blocking domain
provide it via the ops, for other drivers we should call
iommu_paging_domain_alloc().

__iommu_group_alloc_blocking_domain() is the only place that allocates
an BLOCKED domain, so move the ops->blocked_domain logic there.

Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Link: https://lore.kernel.org/r/20241028093810.5901-12-vasant.hegde@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/iommu.c

index 97ad431447363031140239e9e38ca9e2e0cd49a5..fc6aaded94bf5c18182246d7dc17a017e05c8779 100644 (file)
@@ -1956,8 +1956,6 @@ static struct iommu_domain *__iommu_domain_alloc(const struct iommu_ops *ops,
 
        if (alloc_type == IOMMU_DOMAIN_IDENTITY && ops->identity_domain)
                return ops->identity_domain;
-       else if (alloc_type == IOMMU_DOMAIN_BLOCKED && ops->blocked_domain)
-               return ops->blocked_domain;
        else if (type & __IOMMU_DOMAIN_PAGING && ops->domain_alloc_paging)
                domain = ops->domain_alloc_paging(dev);
        else if (ops->domain_alloc)
@@ -3147,22 +3145,25 @@ void iommu_device_unuse_default_domain(struct device *dev)
 
 static int __iommu_group_alloc_blocking_domain(struct iommu_group *group)
 {
+       struct device *dev = iommu_group_first_dev(group);
+       const struct iommu_ops *ops = dev_iommu_ops(dev);
        struct iommu_domain *domain;
 
        if (group->blocking_domain)
                return 0;
 
-       domain = __iommu_group_domain_alloc(group, IOMMU_DOMAIN_BLOCKED);
-       if (IS_ERR(domain)) {
-               /*
-                * For drivers that do not yet understand IOMMU_DOMAIN_BLOCKED
-                * create an empty domain instead.
-                */
-               domain = __iommu_group_domain_alloc(group,
-                                                   IOMMU_DOMAIN_UNMANAGED);
-               if (IS_ERR(domain))
-                       return PTR_ERR(domain);
+       if (ops->blocked_domain) {
+               group->blocking_domain = ops->blocked_domain;
+               return 0;
        }
+
+       /*
+        * For drivers that do not yet understand IOMMU_DOMAIN_BLOCKED create an
+        * empty PAGING domain instead.
+        */
+       domain = iommu_paging_domain_alloc(dev);
+       if (IS_ERR(domain))
+               return PTR_ERR(domain);
        group->blocking_domain = domain;
        return 0;
 }