]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
vfio: Split the register_device ops call into functions
authorJason Gunthorpe <jgg@nvidia.com>
Thu, 22 Sep 2022 19:20:25 +0000 (16:20 -0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 26 Nov 2022 08:27:52 +0000 (09:27 +0100)
[ Upstream commit 9446162e740aefff95c324ac0887f0b68c739695 ]

This is a container item.

A following patch will move the vfio_container functions to their own .c
file.

Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/7-v3-297af71838d2+b9-vfio_container_split_jgg@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Stable-dep-of: 7fdba0011157 ("vfio: Fix container device registration life cycle")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/vfio/vfio_main.c

index c555d497e9e88b8926725db9914856499552e899..48ceca04d9b8a1fb060a934e8b8bb793cc348d75 100644 (file)
@@ -1086,9 +1086,28 @@ static void vfio_device_unassign_container(struct vfio_device *device)
        up_write(&device->group->group_rwsem);
 }
 
+static void vfio_device_container_register(struct vfio_device *device)
+{
+       struct vfio_iommu_driver *iommu_driver =
+               device->group->container->iommu_driver;
+
+       if (iommu_driver && iommu_driver->ops->register_device)
+               iommu_driver->ops->register_device(
+                       device->group->container->iommu_data, device);
+}
+
+static void vfio_device_container_unregister(struct vfio_device *device)
+{
+       struct vfio_iommu_driver *iommu_driver =
+               device->group->container->iommu_driver;
+
+       if (iommu_driver && iommu_driver->ops->unregister_device)
+               iommu_driver->ops->unregister_device(
+                       device->group->container->iommu_data, device);
+}
+
 static struct file *vfio_device_open(struct vfio_device *device)
 {
-       struct vfio_iommu_driver *iommu_driver;
        struct file *filep;
        int ret;
 
@@ -1119,12 +1138,7 @@ static struct file *vfio_device_open(struct vfio_device *device)
                        if (ret)
                                goto err_undo_count;
                }
-
-               iommu_driver = device->group->container->iommu_driver;
-               if (iommu_driver && iommu_driver->ops->register_device)
-                       iommu_driver->ops->register_device(
-                               device->group->container->iommu_data, device);
-
+               vfio_device_container_register(device);
                up_read(&device->group->group_rwsem);
        }
        mutex_unlock(&device->dev_set->lock);
@@ -1162,10 +1176,7 @@ err_close_device:
        if (device->open_count == 1 && device->ops->close_device) {
                device->ops->close_device(device);
 
-               iommu_driver = device->group->container->iommu_driver;
-               if (iommu_driver && iommu_driver->ops->unregister_device)
-                       iommu_driver->ops->unregister_device(
-                               device->group->container->iommu_data, device);
+               vfio_device_container_unregister(device);
        }
 err_undo_count:
        up_read(&device->group->group_rwsem);
@@ -1361,7 +1372,6 @@ static const struct file_operations vfio_group_fops = {
 static int vfio_device_fops_release(struct inode *inode, struct file *filep)
 {
        struct vfio_device *device = filep->private_data;
-       struct vfio_iommu_driver *iommu_driver;
 
        mutex_lock(&device->dev_set->lock);
        vfio_assert_device_open(device);
@@ -1369,10 +1379,7 @@ static int vfio_device_fops_release(struct inode *inode, struct file *filep)
        if (device->open_count == 1 && device->ops->close_device)
                device->ops->close_device(device);
 
-       iommu_driver = device->group->container->iommu_driver;
-       if (iommu_driver && iommu_driver->ops->unregister_device)
-               iommu_driver->ops->unregister_device(
-                       device->group->container->iommu_data, device);
+       vfio_device_container_unregister(device);
        up_read(&device->group->group_rwsem);
        device->open_count--;
        if (device->open_count == 0)