> From: Jason Gunthorpe <jgg@xxxxxxxxxx> > Sent: Saturday, October 2, 2021 7:22 AM > > Split vfio_group_get_from_iommu() into __vfio_group_get_from_iommu() so > that vfio_create_group() can call it to consolidate this duplicated code. Reviewed-by: Liu Yi L <yi.l.liu@xxxxxxxxx> Regards, Yi Liu > Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxx> > --- > drivers/vfio/vfio.c | 55 ++++++++++++++++++++++++--------------------- > 1 file changed, 30 insertions(+), 25 deletions(-) > > diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c > index 32a53cb3598524..1cb12033b02240 100644 > --- a/drivers/vfio/vfio.c > +++ b/drivers/vfio/vfio.c > @@ -344,10 +344,35 @@ static void vfio_group_unlock_and_free(struct > vfio_group *group) > /** > * Group objects - create, release, get, put, search > */ > +static struct vfio_group * > +__vfio_group_get_from_iommu(struct iommu_group *iommu_group) > +{ > + struct vfio_group *group; > + > + list_for_each_entry(group, &vfio.group_list, vfio_next) { > + if (group->iommu_group == iommu_group) { > + vfio_group_get(group); > + return group; > + } > + } > + return NULL; > +} > + > +static struct vfio_group * > +vfio_group_get_from_iommu(struct iommu_group *iommu_group) > +{ > + struct vfio_group *group; > + > + mutex_lock(&vfio.group_lock); > + group = __vfio_group_get_from_iommu(iommu_group); > + mutex_unlock(&vfio.group_lock); > + return group; > +} > + > static struct vfio_group *vfio_create_group(struct iommu_group > *iommu_group, > enum vfio_group_type type) > { > - struct vfio_group *group, *tmp; > + struct vfio_group *group, *existing_group; > struct device *dev; > int ret, minor; > > @@ -378,12 +403,10 @@ static struct vfio_group *vfio_create_group(struct > iommu_group *iommu_group, > mutex_lock(&vfio.group_lock); > > /* Did we race creating this group? */ > - list_for_each_entry(tmp, &vfio.group_list, vfio_next) { > - if (tmp->iommu_group == iommu_group) { > - vfio_group_get(tmp); > - vfio_group_unlock_and_free(group); > - return tmp; > - } > + existing_group = __vfio_group_get_from_iommu(iommu_group); > + if (existing_group) { > + vfio_group_unlock_and_free(group); > + return existing_group; > } > > minor = vfio_alloc_group_minor(group); > @@ -440,24 +463,6 @@ static void vfio_group_get(struct vfio_group *group) > kref_get(&group->kref); > } > > -static > -struct vfio_group *vfio_group_get_from_iommu(struct iommu_group > *iommu_group) > -{ > - struct vfio_group *group; > - > - mutex_lock(&vfio.group_lock); > - list_for_each_entry(group, &vfio.group_list, vfio_next) { > - if (group->iommu_group == iommu_group) { > - vfio_group_get(group); > - mutex_unlock(&vfio.group_lock); > - return group; > - } > - } > - mutex_unlock(&vfio.group_lock); > - > - return NULL; > -} > - > static struct vfio_group *vfio_group_get_from_minor(int minor) > { > struct vfio_group *group; > -- > 2.33.0