Skip to content

Commit

Permalink
iommu: Inline iommu_group_get_for_dev() into __iommu_probe_device()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jason Gunthorpe authored and Joerg Roedel committed Jul 14, 2023
1 parent 5665d15 commit 7bdb996
Showing 1 changed file with 9 additions and 41 deletions.
50 changes: 9 additions & 41 deletions drivers/iommu/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 7bdb996

Please sign in to comment.