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@xxxxxxxxx> --- drivers/gpu/drm/i915/gvt/gvt.h | 1 + drivers/gpu/drm/i915/gvt/kvmgt.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h index 0081b051d3e0..5230ac80b84c 100644 --- a/drivers/gpu/drm/i915/gvt/gvt.h +++ b/drivers/gpu/drm/i915/gvt/gvt.h @@ -219,6 +219,7 @@ struct intel_vgpu { struct work_struct release_work; atomic_t released; struct vfio_device *vfio_device; + struct vfio_group *vfio_group; } vdev; #endif diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c index bd79a9718cc7..ed4c79cc3e09 100644 --- a/drivers/gpu/drm/i915/gvt/kvmgt.c +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c @@ -747,6 +747,7 @@ static int intel_vgpu_open(struct mdev_device *mdev) struct intel_vgpu *vgpu = mdev_get_drvdata(mdev); unsigned long events; int ret; + struct vfio_group *vfio_group; vgpu->vdev.iommu_notifier.notifier_call = intel_vgpu_iommu_notifier; vgpu->vdev.group_notifier.notifier_call = intel_vgpu_group_notifier; @@ -769,6 +770,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_group; + } + vgpu->vdev.vfio_group = vfio_group; + /* Take a module reference as mdev core doesn't take * a reference for vendor driver. */ @@ -785,6 +794,9 @@ static int intel_vgpu_open(struct mdev_device *mdev) return ret; undo_group: + vfio_group_put_external_user(vgpu->vdev.vfio_group); + +undo_register_group: vfio_unregister_notifier(mdev_dev(mdev), VFIO_GROUP_NOTIFY, &vgpu->vdev.group_notifier); @@ -834,6 +846,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(vgpu->vdev.vfio_group); vgpu->vdev.kvm = NULL; vgpu->handle = 0; -- 2.17.1