Skip to content

Commit

Permalink
iommu: Move the iommu driver sysfs setup into iommu_init/deinit_device()
Browse files Browse the repository at this point in the history
It makes logical sense that once the driver is attached to the device the
sysfs links appear, even if we haven't fully created the group_device or
attached the device to a domain.

Fix the missing error handling on sysfs creation since
iommu_init_device() can trivially handle this.

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/6-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 aa09585 commit 14891af
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 10 deletions.
6 changes: 0 additions & 6 deletions drivers/iommu/iommu-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,6 @@ int iommu_device_link(struct iommu_device *iommu, struct device *link)
{
int ret;

if (!iommu || IS_ERR(iommu))
return -ENODEV;

ret = sysfs_add_link_to_group(&iommu->dev->kobj, "devices",
&link->kobj, dev_name(link));
if (ret)
Expand All @@ -126,9 +123,6 @@ EXPORT_SYMBOL_GPL(iommu_device_link);

void iommu_device_unlink(struct iommu_device *iommu, struct device *link)
{
if (!iommu || IS_ERR(iommu))
return;

sysfs_remove_link(&link->kobj, "iommu");
sysfs_remove_link_from_group(&iommu->dev->kobj, "devices", dev_name(link));
}
Expand Down
13 changes: 9 additions & 4 deletions drivers/iommu/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -356,12 +356,16 @@ static int iommu_init_device(struct device *dev, const struct iommu_ops *ops)
goto err_module_put;
}

ret = iommu_device_link(iommu_dev, dev);
if (ret)
goto err_release;

group = ops->device_group(dev);
if (WARN_ON_ONCE(group == NULL))
group = ERR_PTR(-EINVAL);
if (IS_ERR(group)) {
ret = PTR_ERR(group);
goto err_release;
goto err_unlink;
}
dev->iommu_group = group;

Expand All @@ -371,6 +375,8 @@ static int iommu_init_device(struct device *dev, const struct iommu_ops *ops)
dev->iommu->attach_deferred = ops->is_attach_deferred(dev);
return 0;

err_unlink:
iommu_device_unlink(iommu_dev, dev);
err_release:
if (ops->release_device)
ops->release_device(dev);
Expand All @@ -388,6 +394,8 @@ static void iommu_deinit_device(struct device *dev)

lockdep_assert_held(&group->mutex);

iommu_device_unlink(dev->iommu->iommu_dev, dev);

/*
* release_device() must stop using any attached domain on the device.
* If there are still other devices in the group they are not effected
Expand Down Expand Up @@ -462,7 +470,6 @@ static int __iommu_probe_device(struct device *dev, struct list_head *group_list
iommu_group_put(group);

mutex_unlock(&iommu_probe_device_lock);
iommu_device_link(dev->iommu->iommu_dev, dev);

return 0;

Expand Down Expand Up @@ -584,8 +591,6 @@ static void iommu_release_device(struct device *dev)
if (!dev->iommu || !group)
return;

iommu_device_unlink(dev->iommu->iommu_dev, dev);

__iommu_group_remove_device(dev);
}

Expand Down

0 comments on commit 14891af

Please sign in to comment.