mirror of
https://github.com/torvalds/linux
synced 2024-10-07 20:05:15 +00:00
iommu: Move the iommu driver sysfs setup into iommu_init/deinit_device()
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>
This commit is contained in:
parent
aa0958570f
commit
14891af379
|
@ -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)
|
||||
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue