Skip to content

Commit

Permalink
drm/i915/gvt: hold reference of VFIO group during opening of vgpu
Browse files Browse the repository at this point in the history
hold reference count of the VFIO group for each vgpu at vgpu opening and
release the reference at vgpu releasing.

Signed-off-by: Yan Zhao <yan.y.zhao@intel.com>
Reviewed-by: Zhenyu Wang<zhenyuw@linux.intel.com>
Signed-off-by: Zhenyu Wang<zhenyuw@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20200313031025.7936-1-yan.y.zhao@intel.com
  • Loading branch information
Yan Zhao authored and Zhenyu Wang committed Apr 14, 2020
1 parent bcad588 commit 776d95b
Showing 1 changed file with 15 additions and 0 deletions.
15 changes: 15 additions & 0 deletions drivers/gpu/drm/i915/gvt/kvmgt.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ struct kvmgt_vdev {
struct work_struct release_work;
atomic_t released;
struct vfio_device *vfio_device;
struct vfio_group *vfio_group;
};

static inline struct kvmgt_vdev *kvmgt_vdev(struct intel_vgpu *vgpu)
Expand Down Expand Up @@ -792,6 +793,7 @@ static int intel_vgpu_open(struct mdev_device *mdev)
struct kvmgt_vdev *vdev = kvmgt_vdev(vgpu);
unsigned long events;
int ret;
struct vfio_group *vfio_group;

vdev->iommu_notifier.notifier_call = intel_vgpu_iommu_notifier;
vdev->group_notifier.notifier_call = intel_vgpu_group_notifier;
Expand All @@ -814,6 +816,14 @@ static int intel_vgpu_open(struct mdev_device *mdev)
goto undo_iommu;
}

vfio_group = vfio_group_get_external_user_from_dev(mdev_dev(mdev));
if (IS_ERR_OR_NULL(vfio_group)) {
ret = !vfio_group ? -EFAULT : PTR_ERR(vfio_group);
gvt_vgpu_err("vfio_group_get_external_user_from_dev failed\n");
goto undo_register;
}
vdev->vfio_group = vfio_group;

/* Take a module reference as mdev core doesn't take
* a reference for vendor driver.
*/
Expand All @@ -830,6 +840,10 @@ static int intel_vgpu_open(struct mdev_device *mdev)
return ret;

undo_group:
vfio_group_put_external_user(vdev->vfio_group);
vdev->vfio_group = NULL;

undo_register:
vfio_unregister_notifier(mdev_dev(mdev), VFIO_GROUP_NOTIFY,
&vdev->group_notifier);

Expand Down Expand Up @@ -884,6 +898,7 @@ static void __intel_vgpu_release(struct intel_vgpu *vgpu)
kvmgt_guest_exit(info);

intel_vgpu_release_msi_eventfd_ctx(vgpu);
vfio_group_put_external_user(vdev->vfio_group);

vdev->kvm = NULL;
vgpu->handle = 0;
Expand Down

0 comments on commit 776d95b

Please sign in to comment.