[PATCH v1 5/5] drm/i915/gvt: GVTg support ppgtt pvmmio optimization

Zhenyu Wang zhenyuw at linux.intel.com
Mon Nov 5 09:57:55 UTC 2018


On 2018.11.05 17:20:49 +0800, Xiaolin Zhang wrote:
> This patch handles ppgtt update from g2v notification.
> 
> It read out ppgtt pte entries from guest pte tables page and
> convert them to host pfns.
> 
> It creates local ppgtt tables and insert the content pages
> into the local ppgtt tables directly, which does not track
> the usage of guest page table and removes the cost of write
> protection from the original shadow page mechansim.
> 
> v1: rebase
> v0: RFC
> 
> Cc: Zhenyu Wang <zhenyuw at linux.intel.com>
> Cc: Zhi Wang <zhi.a.wang at intel.com>
> Cc: Min He<min.he at intel.com>
> Cc: Fei Jiang <fei.jiang at intel.com>
> Cc: Zhipeng Gong <zhipeng.gong at intel.com>
> Cc: Hang Yuan <hang.yuan at intel.com>
> Cc: Zhiyuan Lv <zhiyuan.lv at intel.com>
> Signed-off-by: Xiaolin Zhang <xiaolin.zhang at intel.com>
> ---
>  drivers/gpu/drm/i915/gvt/gtt.c      | 318 ++++++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/i915/gvt/gtt.h      |   9 +
>  drivers/gpu/drm/i915/gvt/handlers.c |  13 +-
>  3 files changed, 338 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c
> index 58e166e..8d3e21a 100644
> --- a/drivers/gpu/drm/i915/gvt/gtt.c
> +++ b/drivers/gpu/drm/i915/gvt/gtt.c
> @@ -1744,6 +1744,26 @@ static int ppgtt_handle_guest_write_page_table_bytes(
>  	return 0;
>  }
>  
> +static void invalidate_mm_pv(struct intel_vgpu_mm *mm)
> +{
> +	struct intel_vgpu *vgpu = mm->vgpu;
> +	struct intel_gvt *gvt = vgpu->gvt;
> +	struct intel_gvt_gtt *gtt = &gvt->gtt;
> +	struct intel_gvt_gtt_pte_ops *ops = gtt->pte_ops;
> +	struct intel_gvt_gtt_entry se;
> +
> +	i915_ppgtt_close(&mm->ppgtt->vm);
> +	i915_ppgtt_put(mm->ppgtt);
> +
> +	ppgtt_get_shadow_root_entry(mm, &se, 0);
> +	if (!ops->test_present(&se))
> +		return;
> +	se.val64 = 0;
> +	ppgtt_set_shadow_root_entry(mm, &se, 0);
> +
> +	mm->ppgtt_mm.shadowed  = false;
> +}
> +
>  static void invalidate_ppgtt_mm(struct intel_vgpu_mm *mm)
>  {
>  	struct intel_vgpu *vgpu = mm->vgpu;
> @@ -1756,6 +1776,11 @@ static void invalidate_ppgtt_mm(struct intel_vgpu_mm *mm)
>  	if (!mm->ppgtt_mm.shadowed)
>  		return;
>  
> +	if (VGPU_PVMMIO(mm->vgpu) & PVMMIO_PPGTT_UPDATE) {
> +		invalidate_mm_pv(mm);
> +		return;
> +	}
> +
>  	for (index = 0; index < ARRAY_SIZE(mm->ppgtt_mm.shadow_pdps); index++) {
>  		ppgtt_get_shadow_root_entry(mm, &se, index);
>  
> @@ -1773,6 +1798,26 @@ static void invalidate_ppgtt_mm(struct intel_vgpu_mm *mm)
>  	mm->ppgtt_mm.shadowed = false;
>  }
>  
> +static int shadow_mm_pv(struct intel_vgpu_mm *mm)
> +{
> +	struct intel_vgpu *vgpu = mm->vgpu;
> +	struct intel_gvt *gvt = vgpu->gvt;
> +	struct intel_gvt_gtt_entry se;
> +
> +	mm->ppgtt = i915_ppgtt_create(gvt->dev_priv, NULL);
> +	if (IS_ERR(mm->ppgtt)) {
> +		gvt_vgpu_err("fail to create ppgtt for pdp 0x%llx\n",
> +				px_dma(&mm->ppgtt->pml4));
> +		return PTR_ERR(mm->ppgtt);
> +	}

Now vgpu context has already had its ppgtt when create, you need to
refresh against that.

-- 
Open Source Technology Center, Intel ltd.

$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/intel-gvt-dev/attachments/20181105/6de73b29/attachment.sig>


More information about the intel-gvt-dev mailing list