RE: [PATCH 03/11] iommu: Inline iommu_group_get_for_dev() into __iommu_probe_device()

2023-04-26 Thread Tian, Kevin
> From: Jason Gunthorpe 
> Sent: Thursday, April 20, 2023 12:12 AM
> 
> 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.
> 
> Signed-off-by: Jason Gunthorpe 

Reviewed-by: Kevin Tian 


[PATCH 03/11] iommu: Inline iommu_group_get_for_dev() into __iommu_probe_device()

2023-04-19 Thread Jason Gunthorpe
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.

Signed-off-by: Jason Gunthorpe 
---
 drivers/iommu/iommu.c | 50 ---
 1 file changed, 9 insertions(+), 41 deletions(-)

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 73e9f50fba9dd2..e08856c17121d8 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -126,7 +126,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);
 
@@ -375,12 +374,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(>mutex);
if (group_list && !group->default_domain && list_empty(>entry))
list_add_tail(>entry, group_list);
@@ -392,6 +397,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);
@@ -1666,45 +1673,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;
-- 
2.40.0