[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