open_count is incremented before open_device() and decremented after close_device() for each device in the set. This allows devices to determine whether shared resources are in use without tracking them manually or accessing the private open_count in vfio_device. Signed-off-by: Anthony DeRossi <ajderossi@xxxxxxxxx> --- drivers/vfio/vfio_main.c | 3 +++ include/linux/vfio.h | 1 + 2 files changed, 4 insertions(+) diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c index 9a4af880e941..6c65418fc7e3 100644 --- a/drivers/vfio/vfio_main.c +++ b/drivers/vfio/vfio_main.c @@ -761,6 +761,7 @@ static struct file *vfio_device_open(struct vfio_device *device) mutex_lock(&device->group->group_lock); device->kvm = device->group->kvm; + device->dev_set->open_count++; if (device->ops->open_device) { ret = device->ops->open_device(device); if (ret) @@ -809,6 +810,7 @@ static struct file *vfio_device_open(struct vfio_device *device) } err_undo_count: mutex_unlock(&device->group->group_lock); + device->dev_set->open_count--; device->open_count--; if (device->open_count == 0 && device->kvm) device->kvm = NULL; @@ -1023,6 +1025,7 @@ static int vfio_device_fops_release(struct inode *inode, struct file *filep) device->ops->close_device(device); vfio_device_container_unregister(device); + device->dev_set->open_count--; } mutex_unlock(&device->group->group_lock); device->open_count--; diff --git a/include/linux/vfio.h b/include/linux/vfio.h index e7cebeb875dd..5becdcdf4ba2 100644 --- a/include/linux/vfio.h +++ b/include/linux/vfio.h @@ -28,6 +28,7 @@ struct vfio_device_set { struct mutex lock; struct list_head device_list; unsigned int device_count; + unsigned int open_count; }; struct vfio_device { -- 2.37.4