struct vfio_iommu_driver *driver;
int ret = 0;
- lockdep_assert_held_write(&group->group_rwsem);
+ lockdep_assert_held(&group->group_lock);
if (group->type == VFIO_NO_IOMMU && !capable(CAP_SYS_RAWIO))
return -EPERM;
struct vfio_container *container = group->container;
struct vfio_iommu_driver *driver;
- lockdep_assert_held_write(&group->group_rwsem);
+ lockdep_assert_held(&group->group_lock);
WARN_ON(group->container_users != 1);
down_write(&container->group_lock);
{
struct vfio_group *group = device->group;
- lockdep_assert_held_write(&group->group_rwsem);
+ lockdep_assert_held(&group->group_lock);
if (!group->container || !group->container->iommu_driver ||
WARN_ON(!group->container_users))
void vfio_device_unassign_container(struct vfio_device *device)
{
- down_write(&device->group->group_rwsem);
+ mutex_lock(&device->group->group_lock);
WARN_ON(device->group->container_users <= 1);
device->group->container_users--;
fput(device->group->opened_file);
- up_write(&device->group->group_rwsem);
+ mutex_unlock(&device->group->group_lock);
}
/*
struct vfio_group *group = container_of(dev, struct vfio_group, dev);
mutex_destroy(&group->device_lock);
+ mutex_destroy(&group->group_lock);
iommu_group_put(group->iommu_group);
ida_free(&vfio.group_ida, MINOR(group->dev.devt));
kfree(group);
group->cdev.owner = THIS_MODULE;
refcount_set(&group->drivers, 1);
- init_rwsem(&group->group_rwsem);
+ mutex_init(&group->group_lock);
init_swait_queue_head(&group->opened_file_wait);
INIT_LIST_HEAD(&group->device_list);
mutex_init(&group->device_lock);
{
int ret = 0;
- down_write(&group->group_rwsem);
+ mutex_lock(&group->group_lock);
if (!group->container) {
ret = -EINVAL;
goto out_unlock;
vfio_group_detach_container(group);
out_unlock:
- up_write(&group->group_rwsem);
+ mutex_unlock(&group->group_lock);
return ret;
}
if (!f.file)
return -EBADF;
- down_write(&group->group_rwsem);
+ mutex_lock(&group->group_lock);
if (group->container || WARN_ON(group->container_users)) {
ret = -EINVAL;
goto out_unlock;
}
out_unlock:
- up_write(&group->group_rwsem);
+ mutex_unlock(&group->group_lock);
fdput(f);
return ret;
}
struct file *filep;
int ret;
- down_write(&device->group->group_rwsem);
+ mutex_lock(&device->group->group_lock);
ret = vfio_device_assign_container(device);
- up_write(&device->group->group_rwsem);
+ mutex_unlock(&device->group->group_lock);
if (ret)
return ERR_PTR(ret);
* lock. If the device driver will use it, it must obtain a
* reference and release it during close_device.
*/
- down_read(&device->group->group_rwsem);
+ mutex_lock(&device->group->group_lock);
device->kvm = device->group->kvm;
if (device->ops->open_device) {
goto err_undo_count;
}
vfio_device_container_register(device);
- up_read(&device->group->group_rwsem);
+ mutex_unlock(&device->group->group_lock);
}
mutex_unlock(&device->dev_set->lock);
err_close_device:
mutex_lock(&device->dev_set->lock);
- down_read(&device->group->group_rwsem);
+ mutex_lock(&device->group->group_lock);
if (device->open_count == 1 && device->ops->close_device) {
device->ops->close_device(device);
vfio_device_container_unregister(device);
}
err_undo_count:
- up_read(&device->group->group_rwsem);
+ mutex_unlock(&device->group->group_lock);
device->open_count--;
if (device->open_count == 0 && device->kvm)
device->kvm = NULL;
status.flags = 0;
- down_read(&group->group_rwsem);
+ mutex_lock(&group->group_lock);
if (group->container)
status.flags |= VFIO_GROUP_FLAGS_CONTAINER_SET |
VFIO_GROUP_FLAGS_VIABLE;
else if (!iommu_group_dma_owner_claimed(group->iommu_group))
status.flags |= VFIO_GROUP_FLAGS_VIABLE;
- up_read(&group->group_rwsem);
+ mutex_unlock(&group->group_lock);
if (copy_to_user(arg, &status, minsz))
return -EFAULT;
container_of(inode->i_cdev, struct vfio_group, cdev);
int ret;
- down_write(&group->group_rwsem);
+ mutex_lock(&group->group_lock);
/*
* drivers can be zero if this races with vfio_device_remove_group(), it
filep->private_data = group;
ret = 0;
out_unlock:
- up_write(&group->group_rwsem);
+ mutex_unlock(&group->group_lock);
return ret;
}
filep->private_data = NULL;
- down_write(&group->group_rwsem);
+ mutex_lock(&group->group_lock);
/*
* Device FDs hold a group file reference, therefore the group release
* is only called when there are no open devices.
if (group->container)
vfio_group_detach_container(group);
group->opened_file = NULL;
- up_write(&group->group_rwsem);
+ mutex_unlock(&group->group_lock);
swake_up_one(&group->opened_file_wait);
return 0;
mutex_lock(&device->dev_set->lock);
vfio_assert_device_open(device);
- down_read(&device->group->group_rwsem);
+ mutex_lock(&device->group->group_lock);
if (device->open_count == 1 && device->ops->close_device)
device->ops->close_device(device);
vfio_device_container_unregister(device);
- up_read(&device->group->group_rwsem);
+ mutex_unlock(&device->group->group_lock);
device->open_count--;
if (device->open_count == 0)
device->kvm = NULL;
if (file->f_op != &vfio_group_fops)
return true;
- down_read(&group->group_rwsem);
+ mutex_lock(&group->group_lock);
if (group->container) {
ret = vfio_container_ioctl_check_extension(group->container,
VFIO_DMA_CC_IOMMU);
*/
ret = true;
}
- up_read(&group->group_rwsem);
+ mutex_unlock(&group->group_lock);
return ret;
}
EXPORT_SYMBOL_GPL(vfio_file_enforced_coherent);
if (file->f_op != &vfio_group_fops)
return;
- down_write(&group->group_rwsem);
+ mutex_lock(&group->group_lock);
group->kvm = kvm;
- up_write(&group->group_rwsem);
+ mutex_unlock(&group->group_lock);
}
EXPORT_SYMBOL_GPL(vfio_file_set_kvm);