[PATCH 1/2] drm/i915/gvt: Invalidate vGPU PPGTT mm objects during a vGPU reset.

Zhang, Xiong Y xiong.y.zhang at intel.com
Thu Feb 8 06:38:05 UTC 2018


> On 2018.02.07 18:12:14 +0800, Zhi Wang wrote:
> > From: Zhi Wang <zhi.wang.linux at gmail.com>
> >
> > As different OSes might handling GVT PPGTT creation/destory
> > notification differently during a vGPU reset. A better approach is
> > invalidating all vGPU PPGTT mm objects during vGPU reset.
> >
> > Signed-off-by: Zhi Wang <zhi.a.wang at intel.com>
> > ---
> 
> Reviewed-by: Zhenyu Wang <zhenyuw at linux.intel.com>
[Zhang, Xiong Y] What's the purpose of this patch to fix ?
With this patch, one workload cause vgpu reset, the following workload from the same guest process which share ppgtt with the bad workload will fail also, finally guest couldn't recovery from vgpu reset . 
> 
> >  drivers/gpu/drm/i915/gvt/gtt.c  | 22 ++++++++++++++++++++++
> > drivers/gpu/drm/i915/gvt/gtt.h  |  1 +
> > drivers/gpu/drm/i915/gvt/vgpu.c |  1 +
> >  3 files changed, 24 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/i915/gvt/gtt.c
> > b/drivers/gpu/drm/i915/gvt/gtt.c index 8fb4f102..1fa0db5 100644
> > --- a/drivers/gpu/drm/i915/gvt/gtt.c
> > +++ b/drivers/gpu/drm/i915/gvt/gtt.c
> > @@ -2269,6 +2269,28 @@ void intel_gvt_clean_gtt(struct intel_gvt *gvt)
> > }
> >
> >  /**
> > + * intel_vgpu_invalidate_ppgtt - invalidate PPGTT instances
> > + * @vgpu: a vGPU
> > + *
> > + * This function is called when invalidate all PPGTT instances of a vGPU.
> > + *
> > + */
> > +void intel_vgpu_invalidate_ppgtt(struct intel_vgpu *vgpu) {
> > +	struct list_head *pos, *n;
> > +	struct intel_vgpu_mm *mm;
> > +
> > +	list_for_each_safe(pos, n, &vgpu->gtt.ppgtt_mm_list_head) {
> > +		mm = container_of(pos, struct intel_vgpu_mm, ppgtt_mm.list);
> > +		if (mm->type == INTEL_GVT_MM_PPGTT) {
> > +			list_del_init(&mm->ppgtt_mm.lru_list);
> > +			if (mm->ppgtt_mm.shadowed)
> > +				invalidate_ppgtt_mm(mm);
> > +		}
> > +	}
> > +}
> > +
> > +/**
> >   * intel_vgpu_reset_ggtt - reset the GGTT entry
> >   * @vgpu: a vGPU
> >   *
> > diff --git a/drivers/gpu/drm/i915/gvt/gtt.h
> > b/drivers/gpu/drm/i915/gvt/gtt.h index e831507..a8b369c 100644
> > --- a/drivers/gpu/drm/i915/gvt/gtt.h
> > +++ b/drivers/gpu/drm/i915/gvt/gtt.h
> > @@ -194,6 +194,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_invalidate_ppgtt(struct intel_vgpu *vgpu);
> >
> >  extern int intel_gvt_init_gtt(struct intel_gvt *gvt);  void
> > intel_vgpu_reset_gtt(struct intel_vgpu *vgpu); diff --git
> > a/drivers/gpu/drm/i915/gvt/vgpu.c b/drivers/gpu/drm/i915/gvt/vgpu.c
> > index 41f76e8..2e0a02a 100644
> > --- a/drivers/gpu/drm/i915/gvt/vgpu.c
> > +++ b/drivers/gpu/drm/i915/gvt/vgpu.c
> > @@ -522,6 +522,7 @@ void intel_gvt_reset_vgpu_locked(struct intel_vgpu
> *vgpu, bool dmlr,
> >  	/* full GPU reset or device model level reset */
> >  	if (engine_mask == ALL_ENGINES || dmlr) {
> >  		intel_vgpu_select_submission_ops(vgpu, ALL_ENGINES, 0);
> > +		intel_vgpu_invalidate_ppgtt(vgpu);
> >  		/*fence will not be reset during virtual reset */
> >  		if (dmlr) {
> >  			intel_vgpu_reset_gtt(vgpu);
> > --
> > 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


More information about the intel-gvt-dev mailing list