@@ -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 )
@@ -151,6 +152,7 @@ static void gvt_unpin_guest_page(struct intel_vgpu *vgpu, unsigned long gfn,
151
152
unsigned long size )
152
153
{
153
154
struct drm_i915_private * i915 = vgpu -> gvt -> gt -> i915 ;
155
+ struct kvmgt_vdev * vdev = kvmgt_vdev (vgpu );
154
156
int total_pages ;
155
157
int npage ;
156
158
int ret ;
@@ -160,7 +162,7 @@ static void gvt_unpin_guest_page(struct intel_vgpu *vgpu, unsigned long gfn,
160
162
for (npage = 0 ; npage < total_pages ; npage ++ ) {
161
163
unsigned long cur_gfn = gfn + npage ;
162
164
163
- ret = vfio_unpin_pages ( mdev_dev ( kvmgt_vdev ( vgpu ) -> mdev ) , & cur_gfn , 1 );
165
+ ret = vfio_group_unpin_pages ( vdev -> vfio_group , & cur_gfn , 1 );
164
166
drm_WARN_ON (& i915 -> drm , ret != 1 );
165
167
}
166
168
}
@@ -169,6 +171,7 @@ static void gvt_unpin_guest_page(struct intel_vgpu *vgpu, unsigned long gfn,
169
171
static int gvt_pin_guest_page (struct intel_vgpu * vgpu , unsigned long gfn ,
170
172
unsigned long size , struct page * * page )
171
173
{
174
+ struct kvmgt_vdev * vdev = kvmgt_vdev (vgpu );
172
175
unsigned long base_pfn = 0 ;
173
176
int total_pages ;
174
177
int npage ;
@@ -183,8 +186,8 @@ static int gvt_pin_guest_page(struct intel_vgpu *vgpu, unsigned long gfn,
183
186
unsigned long cur_gfn = gfn + npage ;
184
187
unsigned long pfn ;
185
188
186
- ret = vfio_pin_pages ( mdev_dev ( kvmgt_vdev ( vgpu ) -> mdev ) , & cur_gfn , 1 ,
187
- IOMMU_READ | IOMMU_WRITE , & pfn );
189
+ ret = vfio_group_pin_pages ( vdev -> vfio_group , & cur_gfn , 1 ,
190
+ IOMMU_READ | IOMMU_WRITE , & pfn );
188
191
if (ret != 1 ) {
189
192
gvt_vgpu_err ("vfio_pin_pages failed for gfn 0x%lx, ret %d\n" ,
190
193
cur_gfn , ret );
@@ -792,6 +795,7 @@ static int intel_vgpu_open(struct mdev_device *mdev)
792
795
struct kvmgt_vdev * vdev = kvmgt_vdev (vgpu );
793
796
unsigned long events ;
794
797
int ret ;
798
+ struct vfio_group * vfio_group ;
795
799
796
800
vdev -> iommu_notifier .notifier_call = intel_vgpu_iommu_notifier ;
797
801
vdev -> group_notifier .notifier_call = intel_vgpu_group_notifier ;
@@ -814,6 +818,14 @@ static int intel_vgpu_open(struct mdev_device *mdev)
814
818
goto undo_iommu ;
815
819
}
816
820
821
+ vfio_group = vfio_group_get_external_user_from_dev (mdev_dev (mdev ));
822
+ if (IS_ERR_OR_NULL (vfio_group )) {
823
+ ret = !vfio_group ? - EFAULT : PTR_ERR (vfio_group );
824
+ gvt_vgpu_err ("vfio_group_get_external_user_from_dev failed\n" );
825
+ goto undo_register ;
826
+ }
827
+ vdev -> vfio_group = vfio_group ;
828
+
817
829
/* Take a module reference as mdev core doesn't take
818
830
* a reference for vendor driver.
819
831
*/
@@ -830,6 +842,10 @@ static int intel_vgpu_open(struct mdev_device *mdev)
830
842
return ret ;
831
843
832
844
undo_group :
845
+ vfio_group_put_external_user (vdev -> vfio_group );
846
+ vdev -> vfio_group = NULL ;
847
+
848
+ undo_register :
833
849
vfio_unregister_notifier (mdev_dev (mdev ), VFIO_GROUP_NOTIFY ,
834
850
& vdev -> group_notifier );
835
851
@@ -884,6 +900,7 @@ static void __intel_vgpu_release(struct intel_vgpu *vgpu)
884
900
kvmgt_guest_exit (info );
885
901
886
902
intel_vgpu_release_msi_eventfd_ctx (vgpu );
903
+ vfio_group_put_external_user (vdev -> vfio_group );
887
904
888
905
vdev -> kvm = NULL ;
889
906
vgpu -> handle = 0 ;
@@ -2035,33 +2052,14 @@ static int kvmgt_rw_gpa(unsigned long handle, unsigned long gpa,
2035
2052
void * buf , unsigned long len , bool write )
2036
2053
{
2037
2054
struct kvmgt_guest_info * info ;
2038
- struct kvm * kvm ;
2039
- int idx , ret ;
2040
- bool kthread = current -> mm == NULL ;
2041
2055
2042
2056
if (!handle_valid (handle ))
2043
2057
return - ESRCH ;
2044
2058
2045
2059
info = (struct kvmgt_guest_info * )handle ;
2046
- kvm = info -> kvm ;
2047
-
2048
- if (kthread ) {
2049
- if (!mmget_not_zero (kvm -> mm ))
2050
- return - EFAULT ;
2051
- use_mm (kvm -> mm );
2052
- }
2053
-
2054
- idx = srcu_read_lock (& kvm -> srcu );
2055
- ret = write ? kvm_write_guest (kvm , gpa , buf , len ) :
2056
- kvm_read_guest (kvm , gpa , buf , len );
2057
- srcu_read_unlock (& kvm -> srcu , idx );
2058
-
2059
- if (kthread ) {
2060
- unuse_mm (kvm -> mm );
2061
- mmput (kvm -> mm );
2062
- }
2063
2060
2064
- return ret ;
2061
+ return vfio_dma_rw (kvmgt_vdev (info -> vgpu )-> vfio_group ,
2062
+ gpa , buf , len , write );
2065
2063
}
2066
2064
2067
2065
static int kvmgt_read_gpa (unsigned long handle , unsigned long gpa ,
0 commit comments