vfio: Common function to increment container_users
This change rearrange functions to have common function to increment container_users Signed-off-by: Kirti Wankhede <kwankhede@nvidia.com> Signed-off-by: Neo Jia <cjia@nvidia.com> Reviewed-by: Jike Song <jike.song@intel.com> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
Родитель
7ed3ea8a71
Коммит
32f55d835b
|
@ -1385,6 +1385,23 @@ static bool vfio_group_viable(struct vfio_group *group)
|
||||||
group, vfio_dev_viable) == 0);
|
group, vfio_dev_viable) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vfio_group_add_container_user(struct vfio_group *group)
|
||||||
|
{
|
||||||
|
if (!atomic_inc_not_zero(&group->container_users))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (group->noiommu) {
|
||||||
|
atomic_dec(&group->container_users);
|
||||||
|
return -EPERM;
|
||||||
|
}
|
||||||
|
if (!group->container->iommu_driver || !vfio_group_viable(group)) {
|
||||||
|
atomic_dec(&group->container_users);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct file_operations vfio_device_fops;
|
static const struct file_operations vfio_device_fops;
|
||||||
|
|
||||||
static int vfio_group_get_device_fd(struct vfio_group *group, char *buf)
|
static int vfio_group_get_device_fd(struct vfio_group *group, char *buf)
|
||||||
|
@ -1694,23 +1711,14 @@ static const struct file_operations vfio_device_fops = {
|
||||||
struct vfio_group *vfio_group_get_external_user(struct file *filep)
|
struct vfio_group *vfio_group_get_external_user(struct file *filep)
|
||||||
{
|
{
|
||||||
struct vfio_group *group = filep->private_data;
|
struct vfio_group *group = filep->private_data;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (filep->f_op != &vfio_group_fops)
|
if (filep->f_op != &vfio_group_fops)
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
if (!atomic_inc_not_zero(&group->container_users))
|
ret = vfio_group_add_container_user(group);
|
||||||
return ERR_PTR(-EINVAL);
|
if (ret)
|
||||||
|
return ERR_PTR(ret);
|
||||||
if (group->noiommu) {
|
|
||||||
atomic_dec(&group->container_users);
|
|
||||||
return ERR_PTR(-EPERM);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!group->container->iommu_driver ||
|
|
||||||
!vfio_group_viable(group)) {
|
|
||||||
atomic_dec(&group->container_users);
|
|
||||||
return ERR_PTR(-EINVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
vfio_group_get(group);
|
vfio_group_get(group);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче