Received: by 2002:a25:e7d8:0:0:0:0:0 with SMTP id e207csp1233165ybh; Thu, 12 Mar 2020 20:16:54 -0700 (PDT) X-Google-Smtp-Source: ADFU+vsWafJ3gbpVMTqVfOxihdNy4bgwSGS7c+GsElTLupVboJtowwgwaPdEyD0j6YGkrFr7XUub X-Received: by 2002:a05:6830:114f:: with SMTP id x15mr9060857otq.306.1584069414104; Thu, 12 Mar 2020 20:16:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1584069414; cv=none; d=google.com; s=arc-20160816; b=fLbgpAgU77Fnt6DZDyiZljMelSXAeOCyjltbKii3eq5TaAlZqHRu2vPZ9ANNkeG2tp OusdcxMMr22URAa9CgCfWNH2qejDC/wQ6n7FIbUtwoGVxH8kT3z5teH7oddOkx641UX3 Cq/i3g4YEgVxUmPDVcI4y1JAdSJ1USFp62aFFHBkd9yVDfA4bW+G7kOiCZdgT7w+JWoG bE+NHtsKLPhKuGDiQ1rn8vr0/oeV2r8UzMZoljhi4+kMbtcJx8mZnNzRT4YXHf9YqhjH hrkzX5yu4KIUa0kgU1XHK6+kB5Kpa5/4xSk3D8hXu6lQehItqcgZj4tDTjOOzvugZJNE BsQQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=4ziSDXkJBgoKhaznmyeTRNTU8kPolrRtRra2t26Kf3o=; b=PXafB3ukIO6SB6o/2yltC6uvKMyGtsn97SamZb8ta/l/KZNetXOTyB5aIanpbsf1Bf vNfGX+D1NS5wag65n+LzDzIuuegENa23WRYjRHKNJMZh22n/mut2fh68ZZzs+1bPaf9W PVgyZZGbcy0ysguuKhYL+sxotK8iEOHJRSmCSG5Hz4FsHAcmhWTq2jfb5FjgsuS+D3Cv 0wnPuOrcfQketkj/4yUso9FjjqK2E9XfLn3hay/pqedUOsRCSpTUAZzPu4wIGydUWG7S 8qIUWEUr+DgCFIz1gwHjrChgkdgKBQMhD6aqnjMmG4cKps/zvnN7TRNs39LzXesxkZH0 uEVw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e6si4200474oti.166.2020.03.12.20.16.41; Thu, 12 Mar 2020 20:16:54 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726461AbgCMDQN (ORCPT + 99 others); Thu, 12 Mar 2020 23:16:13 -0400 Received: from mga11.intel.com ([192.55.52.93]:7288 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726246AbgCMDQN (ORCPT ); Thu, 12 Mar 2020 23:16:13 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Mar 2020 20:16:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,546,1574150400"; d="scan'208";a="232279013" Received: from joy-optiplex-7040.sh.intel.com ([10.239.13.16]) by orsmga007.jf.intel.com with ESMTP; 12 Mar 2020 20:16:10 -0700 From: Yan Zhao To: intel-gvt-dev@lists.freedesktop.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: alex.williamson@redhat.com, zhenyuw@linux.intel.com, pbonzini@redhat.com, kevin.tian@intel.com, peterx@redhat.com, Yan Zhao Subject: [PATCH v4 0/7] use vfio_dma_rw to read/write IOVAs from CPU side Date: Thu, 12 Mar 2020 23:05:48 -0400 Message-Id: <20200313030548.7705-1-yan.y.zhao@intel.com> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org It is better for a device model to use IOVAs to read/write memory to perform some sort of virtual DMA on behalf of the device. patch 1 exports VFIO group to external user so that it can hold the group reference until finishing using of it. It saves ~500 cycles that are spent on VFIO group looking up, referencing and dereferencing. (this data is measured with 1 VFIO user). patch 2 introduces interface vfio_dma_rw(). patch 3 introduces interfaces vfio_group_pin_pages() and vfio_group_unpin_pages() to get rid of VFIO group looking-up in vfio_pin_pages() and vfio_unpin_pages(). patch 4-5 let kvmgt switch from calling kvm_read/write_guest() to calling vfio_dma_rw to rw IOVAs. patch 6 let kvmgt switch to use lighter version of vfio_pin/unpin_pages(), i.e. vfio_group_pin/unpin_pages() patch 7 enables kvmgt to read/write IOVAs of size larger than PAGE_SIZE. Performance: Comparison between vfio_dma_rw() and kvm_read/write_guest(): 1. avergage CPU cycles of each interface measured with 1 running VM: -------------------------------------------------- | rw | avg cycles of | | size | (vfio_dma_rw - kvm_read/write_guest) | |---------- ---------------------------------------| | <= 1 page | +155 ~ +195 | |--------------------------------------------------| | 5 pages | -530 | |--------------------------------------------------| | 20 pages | -2005 ~ -2533 | -------------------------------------------------- 2. average scores base: base code before applying code in this series. use kvm_read/write_pages() to rw IOVAs base + this series: use vfio_dma_rw() to read IOVAs and use vfio_group_pin/unpin_pages(), and kvmgt is able to rw several pages at a time. Scores of benchmarks running in 1 VM each: ----------------------------------------------------------------- | | glmark2 | lightsmark | openarena | heavens | |-----------------------------------------------------------------| | base | 1248 | 219.70 | 114.9 | 560 | |-----------------------------------------------------------------| |base + this series | 1248 | 225.8 | 115 | 559 | ----------------------------------------------------------------- Sum of scores of two benchmark instances running in 2 VMs each: ------------------------------------------------------- | | glmark2 | lightsmark | openarena | |-------------------------------------------------------| | base | 812 | 211.46 | 115.3 | |-------------------------------------------------------| |base + this series | 814 | 214.69 | 115.9 | ------------------------------------------------------- Changelogs: v3 --> v4: - rebased to 5.6.0-rc4+ - adjust wrap position for vfio_group_get_external_user_from_dev() in header file.(Alex) - updated function description of vfio_group_get_external_user_from_dev() (Alex) - fixed Error path group reference leaking in vfio_group_get_external_user_from_dev() (Alex) - reurn 0 for success or errno in vfio_dma_rw_chunk(). (Alex) - renamed iova to user_iova in interface vfio_dam_rw(). - renamed vfio_pin_pages_from_group() and vfio_unpin_pages_from_group() to vfio_group_pin_pages() and vfio_group_unpin_pages() - renamed user_pfn to user_iova_pfn in vfio_group_pin_pages() and vfio_group_unpin_pages() v2 --> v3: - add vfio_group_get_external_user_from_dev() to improve performance (Alex) - add vfio_pin/unpin_pages_from_group() to avoid repeated looking up of VFIO group in vfio_pin/unpin_pages() (Alex) - add a check for IOMMU_READ permission. (Alex) - rename vfio_iommu_type1_rw_dma_nopin() to vfio_iommu_type1_dma_rw_chunk(). (Alex) - in kvmgt, change "write ? vfio_dma_rw(...,true) : vfio_dma_rw(...,false)" to vfio_dma_rw(dev, gpa, buf, len, write) (Alex and Paolo) - in kvmgt, instead of read/write context pages 1:1, combining the reads/writes of continuous IOVAs to take advantage of vfio_dma_rw() for faster crossing page boundary accesses. v1 --> v2: - rename vfio_iova_rw to vfio_dma_rw, vfio iommu driver ops .iova_rw to .dma_rw. (Alex). - change iova and len from unsigned long to dma_addr_t and size_t, respectively. (Alex) - fix possible overflow in dma->vaddr + iova - dma->iova + offset (Alex) - split DMAs from on page boundary to on max available size to eliminate redundant searching of vfio_dma and switching mm. (Alex) - add a check for IOMMU_WRITE permission. Yan Zhao (7): vfio: allow external user to get vfio group from device vfio: introduce vfio_dma_rw to read/write a range of IOVAs vfio: avoid inefficient operations on VFIO group in vfio_pin/unpin_pages drm/i915/gvt: hold reference of VFIO group during opening of vgpu drm/i915/gvt: subsitute kvm_read/write_guest with vfio_dma_rw drm/i915/gvt: switch to user vfio_group_pin/upin_pages drm/i915/gvt: rw more pages a time for shadow context drivers/gpu/drm/i915/gvt/kvmgt.c | 46 ++++--- drivers/gpu/drm/i915/gvt/scheduler.c | 97 ++++++++++----- drivers/vfio/vfio.c | 180 +++++++++++++++++++++++++++ drivers/vfio/vfio_iommu_type1.c | 76 +++++++++++ include/linux/vfio.h | 13 ++ 5 files changed, 360 insertions(+), 52 deletions(-) -- 2.17.1