Message ID | 3-v2-3c3bb7aa6e48+1916b-iommu_probe_jgg@nvidia.com |
---|---|
State | Accepted |
Commit | 7bdb99622f7e7dcaa58bfc2fa98caf23cfc40994 |
Headers | show |
Series | Consolidate the probe_device path | expand |
On 5/20/23 2:42 AM, Jason Gunthorpe wrote: > 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> > Signed-off-by: Jason Gunthorpe<jgg@nvidia.com> > --- > 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 35dadcc9999f8b..6177e01ced67ab 100644 > --- a/drivers/iommu/iommu.c > +++ b/drivers/iommu/iommu.c > @@ -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: nit: perhaps out_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; > } Others look good to me: Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com> Best regards, baolu
On Sun, May 21, 2023 at 04:19:34PM +0800, Baolu Lu wrote: > On 5/20/23 2:42 AM, Jason Gunthorpe wrote: > > 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> > > Signed-off-by: Jason Gunthorpe<jgg@nvidia.com> > > --- > > 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 35dadcc9999f8b..6177e01ced67ab 100644 > > --- a/drivers/iommu/iommu.c > > +++ b/drivers/iommu/iommu.c > > @@ -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: > > nit: perhaps out_put_group? err_ is the right label, this is not a success path.. Most of the labels are err_ except for out_unlock which is sometimes a success and out_module_put which has always been mislabeled.. Jason
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 35dadcc9999f8b..6177e01ced67ab 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -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;