[PATCH v2] drm/i915/gvt: Missed to cancel dma map for ggtt entries
Zhenyu Wang
zhenyuw at linux.intel.com
Fri Mar 23 03:07:28 UTC 2018
On 2018.03.20 16:53:09 +0800, changbin.du at intel.com wrote:
> From: Changbin Du <changbin.du at intel.com>
>
> We have canceled dma map for ppgtt entries. Ditto, don't
> forget ggtt entries.
>
> v2: also unmap ggtt during reset.
>
Better split the reset handling part.
> @@ -1844,10 +1866,10 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
>
> memcpy((void *)&e.val64 + (off & (info->gtt_entry_size - 1)), p_data,
> bytes);
> - m = e;
>
> if (ops->test_present(&e)) {
> gfn = ops->get_pfn(&e);
> + m = e;
>
> /* one PTE update may be issued in multiple writes and the
> * first write may not construct a valid gfn
> @@ -1868,8 +1890,12 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
> ops->set_pfn(&m, gvt->gtt.scratch_mfn);
> } else
> ops->set_pfn(&m, dma_addr >> PAGE_SHIFT);
> - } else
> + } else {
> + ggtt_get_host_entry(ggtt_mm, &m, g_gtt_index);
> + ggtt_invalidate_pte(vgpu, &m);
> ops->set_pfn(&m, gvt->gtt.scratch_mfn);
> + ops->clear_present(&m);
> + }
why need force clear here?
>
> out:
> ggtt_set_host_entry(ggtt_mm, &m, g_gtt_index);
> @@ -2030,7 +2056,7 @@ int intel_vgpu_init_gtt(struct intel_vgpu *vgpu)
> return PTR_ERR(gtt->ggtt_mm);
> }
>
> - intel_vgpu_reset_ggtt(vgpu);
> + intel_vgpu_reset_ggtt(vgpu, false);
>
> return create_scratch_page_tree(vgpu);
> }
> @@ -2315,17 +2341,19 @@ void intel_vgpu_invalidate_ppgtt(struct intel_vgpu *vgpu)
> /**
> * intel_vgpu_reset_ggtt - reset the GGTT entry
> * @vgpu: a vGPU
> + * @invalidate_old: invalidate old entries
> *
> * This function is called at the vGPU create stage
> * to reset all the GGTT entries.
> *
> */
> -void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu)
> +void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu, bool invalidate_old)
> {
> struct intel_gvt *gvt = vgpu->gvt;
> struct drm_i915_private *dev_priv = gvt->dev_priv;
> struct intel_gvt_gtt_pte_ops *pte_ops = vgpu->gvt->gtt.pte_ops;
> struct intel_gvt_gtt_entry entry = {.type = GTT_TYPE_GGTT_PTE};
> + struct intel_gvt_gtt_entry old_entry;
> u32 index;
> u32 num_entries;
>
> @@ -2334,13 +2362,25 @@ void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu)
>
> index = vgpu_aperture_gmadr_base(vgpu) >> PAGE_SHIFT;
> num_entries = vgpu_aperture_sz(vgpu) >> PAGE_SHIFT;
> - while (num_entries--)
> - ggtt_set_host_entry(vgpu->gtt.ggtt_mm, &entry, index++);
> + while (num_entries--) {
> + if (invalidate_old) {
> + ggtt_get_host_entry(vgpu->gtt.ggtt_mm, &old_entry, index);
> + ggtt_invalidate_pte(vgpu, &old_entry);
> + }
> + ggtt_set_host_entry(vgpu->gtt.ggtt_mm, &entry, index);
> + index++;
> + }
could simply keep original code style
>
> index = vgpu_hidden_gmadr_base(vgpu) >> PAGE_SHIFT;
> num_entries = vgpu_hidden_sz(vgpu) >> PAGE_SHIFT;
> - while (num_entries--)
> - ggtt_set_host_entry(vgpu->gtt.ggtt_mm, &entry, index++);
> + while (num_entries--) {
> + if (invalidate_old) {
> + ggtt_get_host_entry(vgpu->gtt.ggtt_mm, &old_entry, index);
> + ggtt_invalidate_pte(vgpu, &old_entry);
> + }
> + ggtt_set_host_entry(vgpu->gtt.ggtt_mm, &entry, index);
> + index++;
> + }
>
> ggtt_invalidate(dev_priv);
> }
> @@ -2360,5 +2400,5 @@ void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu)
> * removing the shadow pages.
> */
> intel_vgpu_destroy_all_ppgtt_mm(vgpu);
> - intel_vgpu_reset_ggtt(vgpu);
> + intel_vgpu_reset_ggtt(vgpu, true);
> }
> diff --git a/drivers/gpu/drm/i915/gvt/gtt.h b/drivers/gpu/drm/i915/gvt/gtt.h
> index a8b369c..3792f2b 100644
> --- a/drivers/gpu/drm/i915/gvt/gtt.h
> +++ b/drivers/gpu/drm/i915/gvt/gtt.h
> @@ -193,7 +193,7 @@ struct intel_vgpu_gtt {
>
> extern int intel_vgpu_init_gtt(struct intel_vgpu *vgpu);
> extern void intel_vgpu_clean_gtt(struct intel_vgpu *vgpu);
> -void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu);
> +void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu, bool invalidate_old);
> void intel_vgpu_invalidate_ppgtt(struct intel_vgpu *vgpu);
>
> extern int intel_gvt_init_gtt(struct intel_gvt *gvt);
> --
> 2.7.4
>
> _______________________________________________
> intel-gvt-dev mailing list
> intel-gvt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev
--
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/20180323/32bc519a/attachment.sig>
More information about the intel-gvt-dev
mailing list