@@ -131,6 +131,7 @@ struct kvmgt_vdev {
131
131
struct work_struct release_work ;
132
132
atomic_t released ;
133
133
struct vfio_device * vfio_device ;
134
+ struct vfio_group * vfio_group ;
134
135
};
135
136
136
137
static inline struct kvmgt_vdev * kvmgt_vdev (struct intel_vgpu * vgpu )
@@ -792,6 +793,7 @@ static int intel_vgpu_open(struct mdev_device *mdev)
792
793
struct kvmgt_vdev * vdev = kvmgt_vdev (vgpu );
793
794
unsigned long events ;
794
795
int ret ;
796
+ struct vfio_group * vfio_group ;
795
797
796
798
vdev -> iommu_notifier .notifier_call = intel_vgpu_iommu_notifier ;
797
799
vdev -> group_notifier .notifier_call = intel_vgpu_group_notifier ;
@@ -814,6 +816,14 @@ static int intel_vgpu_open(struct mdev_device *mdev)
814
816
goto undo_iommu ;
815
817
}
816
818
819
+ vfio_group = vfio_group_get_external_user_from_dev (mdev_dev (mdev ));
820
+ if (IS_ERR_OR_NULL (vfio_group )) {
821
+ ret = !vfio_group ? - EFAULT : PTR_ERR (vfio_group );
822
+ gvt_vgpu_err ("vfio_group_get_external_user_from_dev failed\n" );
823
+ goto undo_register ;
824
+ }
825
+ vdev -> vfio_group = vfio_group ;
826
+
817
827
/* Take a module reference as mdev core doesn't take
818
828
* a reference for vendor driver.
819
829
*/
@@ -830,6 +840,10 @@ static int intel_vgpu_open(struct mdev_device *mdev)
830
840
return ret ;
831
841
832
842
undo_group :
843
+ vfio_group_put_external_user (vdev -> vfio_group );
844
+ vdev -> vfio_group = NULL ;
845
+
846
+ undo_register :
833
847
vfio_unregister_notifier (mdev_dev (mdev ), VFIO_GROUP_NOTIFY ,
834
848
& vdev -> group_notifier );
835
849
@@ -884,6 +898,7 @@ static void __intel_vgpu_release(struct intel_vgpu *vgpu)
884
898
kvmgt_guest_exit (info );
885
899
886
900
intel_vgpu_release_msi_eventfd_ctx (vgpu );
901
+ vfio_group_put_external_user (vdev -> vfio_group );
887
902
888
903
vdev -> kvm = NULL ;
889
904
vgpu -> handle = 0 ;
0 commit comments