mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 04:47:05 +00:00
vfio: Split the register_device ops call into functions
[ Upstream commit9446162e74
] 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:7fdba00111
("vfio: Fix container device registration life cycle") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
6f6b753192
commit
b434476267
1 changed files with 23 additions and 16 deletions
|
@ -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 @@ static struct file *vfio_device_open(struct vfio_device *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)
|
||||
|
|
Loading…
Reference in a new issue