iommu: Inline iommu_group_get_for_dev() into __iommu_probe_device()
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 6 Jun 2023 00:59:41 +0000 (21:59 -0300)
committerJoerg Roedel <jroedel@suse.de>
Fri, 14 Jul 2023 14:14:13 +0000 (16:14 +0200)
This is the only caller, and it doesn't need the generality of the
function. We already know there is no iommu_group, so it is simply two
function calls.

Moving it here allows the following patches to split the logic in these
functions.

Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/3-v3-328044aa278c+45e49-iommu_probe_jgg@nvidia.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/iommu.c

index 2f16f988ab363af925af7d5e1a5021aa7af6aaaf..bd56cf02bc998a762812bdf641423259d907b9e3 100644 (file)
@@ -127,7 +127,6 @@ static int iommu_setup_default_domain(struct iommu_group *group,
                                      int target_type);
 static int iommu_create_device_direct_mappings(struct iommu_domain *domain,
                                               struct device *dev);
-static struct iommu_group *iommu_group_get_for_dev(struct device *dev);
 static ssize_t iommu_group_store_type(struct iommu_group *group,
                                      const char *buf, size_t count);
 
@@ -379,12 +378,18 @@ static int __iommu_probe_device(struct device *dev, struct list_head *group_list
        if (ops->is_attach_deferred)
                dev->iommu->attach_deferred = ops->is_attach_deferred(dev);
 
-       group = iommu_group_get_for_dev(dev);
+       group = ops->device_group(dev);
+       if (WARN_ON_ONCE(group == NULL))
+               group = ERR_PTR(-EINVAL);
        if (IS_ERR(group)) {
                ret = PTR_ERR(group);
                goto out_release;
        }
 
+       ret = iommu_group_add_device(group, dev);
+       if (ret)
+               goto err_put_group;
+
        mutex_lock(&group->mutex);
        if (group_list && !group->default_domain && list_empty(&group->entry))
                list_add_tail(&group->entry, group_list);
@@ -396,6 +401,8 @@ static int __iommu_probe_device(struct device *dev, struct list_head *group_list
 
        return 0;
 
+err_put_group:
+       iommu_group_put(group);
 out_release:
        if (ops->release_device)
                ops->release_device(dev);
@@ -1670,45 +1677,6 @@ iommu_group_alloc_default_domain(struct iommu_group *group, int req_type)
        return dom;
 }
 
-/**
- * iommu_group_get_for_dev - Find or create the IOMMU group for a device
- * @dev: target device
- *
- * This function is intended to be called by IOMMU drivers and extended to
- * support common, bus-defined algorithms when determining or creating the
- * IOMMU group for a device.  On success, the caller will hold a reference
- * to the returned IOMMU group, which will already include the provided
- * device.  The reference should be released with iommu_group_put().
- */
-static struct iommu_group *iommu_group_get_for_dev(struct device *dev)
-{
-       const struct iommu_ops *ops = dev_iommu_ops(dev);
-       struct iommu_group *group;
-       int ret;
-
-       group = iommu_group_get(dev);
-       if (group)
-               return group;
-
-       group = ops->device_group(dev);
-       if (WARN_ON_ONCE(group == NULL))
-               return ERR_PTR(-EINVAL);
-
-       if (IS_ERR(group))
-               return group;
-
-       ret = iommu_group_add_device(group, dev);
-       if (ret)
-               goto out_put_group;
-
-       return group;
-
-out_put_group:
-       iommu_group_put(group);
-
-       return ERR_PTR(ret);
-}
-
 struct iommu_domain *iommu_group_default_domain(struct iommu_group *group)
 {
        return group->default_domain;