@@ -1966,31 +1966,19 @@ static int kvmgt_rw_gpa(unsigned long handle, unsigned long gpa,
void *buf, unsigned long len, bool write)
{
struct kvmgt_guest_info *info;
- struct kvm *kvm;
- int idx, ret;
- bool kthread = current->mm == NULL;
+ int ret;
+ struct intel_vgpu *vgpu;
+ struct device *dev;
if (!handle_valid(handle))
return -ESRCH;
info = (struct kvmgt_guest_info *)handle;
- kvm = info->kvm;
-
- if (kthread) {
- if (!mmget_not_zero(kvm->mm))
- return -EFAULT;
- use_mm(kvm->mm);
- }
-
- idx = srcu_read_lock(&kvm->srcu);
- ret = write ? kvm_write_guest(kvm, gpa, buf, len) :
- kvm_read_guest(kvm, gpa, buf, len);
- srcu_read_unlock(&kvm->srcu, idx);
+ vgpu = info->vgpu;
+ dev = mdev_dev(vgpu->vdev.mdev);
- if (kthread) {
- unuse_mm(kvm->mm);
- mmput(kvm->mm);
- }
+ ret = write ? vfio_iova_rw(dev, gpa, buf, len, true) :
+ vfio_iova_rw(dev, gpa, buf, len, false);
return ret;
}
As a device model, it is better to read/write guest memory using vfio interface, so that vfio is able to maintain dirty info of device IOVAs. Compared to CPU side interfaces kvm_read/write_guest(), vfio_iova_rw() has ~600 cycles more overhead on average. ------------------------------------- | interface | avg cpu cycles | |-----------------------------------| | kvm_write_guest | 1546 | | ----------------------------------| | kvm_read_guest | 686 | |-----------------------------------| | vfio_iova_rw(w) | 2233 | |-----------------------------------| | vfio_iova_rw(r) | 1262 | ------------------------------------- Comparison of benchmarks scores are as blow: --------------------------------------------------------- | avg score | kvm_read/write_guest | vfio_iova_rw | --------------------------------------------------------- | Glmark2 | 1132 | 1138.2 | --------------------------------------------------------- | Lightsmark | 61.558 | 61.538 | |-------------------------------------------------------- | OpenArena | 142.77 | 136.6 | --------------------------------------------------------- | Heaven | 698 | 686.8 | -------------------------------------------------------- No obvious performance downgrade found. Cc: Kevin Tian <kevin.tian@intel.com> Signed-off-by: Yan Zhao <yan.y.zhao@intel.com> --- drivers/gpu/drm/i915/gvt/kvmgt.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-)