drm/i915/gvt: Invalidate vGPU PPGTT mm objects during a vGPU reset.
authorZhi Wang <zhi.wang.linux@gmail.com>
Wed, 7 Feb 2018 10:12:14 +0000 (18:12 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Mon, 19 Mar 2018 06:51:20 +0000 (14:51 +0800)
As different OSes might handling GVT PPGTT creation/destroy 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@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
drivers/gpu/drm/i915/gvt/gtt.c
drivers/gpu/drm/i915/gvt/gtt.h
drivers/gpu/drm/i915/gvt/vgpu.c

index 8eb76becd67610f112b0f0f6c8941678d620cace..d292812315077469848dc536a36fb7fa086d003d 100644 (file)
@@ -2290,6 +2290,28 @@ void intel_gvt_clean_gtt(struct intel_gvt *gvt)
                clean_spt_oos(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
index e831507e17c3d50ed4682a9638eb41736d30b79b..a8b369cd352b89d567fb9f8926e58debf76cfc40 100644 (file)
@@ -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);
index 41f76e86aa1f14bdfae281440cde412d86a3ce7f..2e0a02a80fe4d2b2473fcd060329086dc620bd05 100644 (file)
@@ -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);