diff options
author | Jason Gunthorpe <jgg@nvidia.com> | 2021-10-15 14:40:51 +0300 |
---|---|---|
committer | Alex Williamson <alex.williamson@redhat.com> | 2021-10-15 22:58:19 +0300 |
commit | 1ceabade1df78c420e30efd4d39a48ceb46487bc (patch) | |
tree | 4034f2f795d6d0fffecc047cb015847ce9bed077 | |
parent | 63b150fde7a2549e8bf7cb0fca7e9cfb9cad50d7 (diff) | |
download | linux-1ceabade1df78c420e30efd4d39a48ceb46487bc.tar.xz |
vfio: Do not open code the group list search in vfio_create_group()
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@intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/2-v3-2fdfe4ca2cc6+18c-vfio_group_cdev_jgg@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
-rw-r--r-- | drivers/vfio/vfio.c | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c index 4ce7e9fe43af..513fb5a4c102 100644 --- a/drivers/vfio/vfio.c +++ b/drivers/vfio/vfio.c @@ -340,10 +340,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; @@ -373,12 +398,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); @@ -441,24 +464,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; |