[PATCH v2] drm/i915/gvt: Missed to cancel dma map for ggtt entries
Du, Changbin
changbin.du at intel.com
Fri Mar 23 08:05:04 UTC 2018
On Fri, Mar 23, 2018 at 11:07:28AM +0800, Zhenyu Wang wrote:
> 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.
>
ok.
> > @@ -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?
>
of cause, the pte is going to be non-present.
> >
> > 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
>
What is the 'original code style'? inline 'index++'?
> >
> > 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
> _______________________________________________
> intel-gvt-dev mailing list
> intel-gvt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev
--
Thanks,
Changbin Du
More information about the intel-gvt-dev
mailing list