[PATCH v2 1/3] drm/i915/gvt: Factor out intel_vgpu_invalidate_mm()

Zhi Wang zhi.wang.linux at gmail.com
Thu Nov 2 16:39:57 UTC 2017


Factor out intel_vgpu_invalidate_mm() for callers which wants to
invalidate vGPU mm.

v2:

- Keep the intel_vgpu_ prefix. (Zhenyu)

Signed-off-by: Zhi Wang <zhi.a.wang at intel.com>
---
 drivers/gpu/drm/i915/gvt/gtt.c | 102 +++++++++++++++++++++++------------------
 drivers/gpu/drm/i915/gvt/gtt.h |   4 +-
 2 files changed, 60 insertions(+), 46 deletions(-)

diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c
index 6fa9271..5cff7c5 100644
--- a/drivers/gpu/drm/i915/gvt/gtt.c
+++ b/drivers/gpu/drm/i915/gvt/gtt.c
@@ -1748,6 +1748,62 @@ int intel_vgpu_pin_mm(struct intel_vgpu_mm *mm)
 	return 0;
 }
 
+static void intel_vgpu_invalidate_ggtt(struct intel_vgpu *vgpu)
+{
+	struct intel_gvt *gvt = vgpu->gvt;
+	struct drm_i915_private *dev_priv = gvt->dev_priv;
+	struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
+	u32 index;
+	u32 offset;
+	u32 num_entries;
+	struct intel_gvt_gtt_entry e;
+
+	memset(&e, 0, sizeof(struct intel_gvt_gtt_entry));
+	e.type = GTT_TYPE_GGTT_PTE;
+	ops->set_pfn(&e, gvt->gtt.scratch_mfn);
+	e.val64 |= _PAGE_PRESENT;
+
+	index = vgpu_aperture_gmadr_base(vgpu) >> PAGE_SHIFT;
+	num_entries = vgpu_aperture_sz(vgpu) >> PAGE_SHIFT;
+	for (offset = 0; offset < num_entries; offset++)
+		ops->set_entry(NULL, &e, index + offset, false, 0, vgpu);
+
+	index = vgpu_hidden_gmadr_base(vgpu) >> PAGE_SHIFT;
+	num_entries = vgpu_hidden_sz(vgpu) >> PAGE_SHIFT;
+	for (offset = 0; offset < num_entries; offset++)
+		ops->set_entry(NULL, &e, index + offset, false, 0, vgpu);
+
+	gtt_invalidate(dev_priv);
+}
+
+/*
+ * intel_vgpu_invalidate_mm - Invalidate vGPU mm by type
+ * @vgpu: a vGPU
+ * @type: mm type
+ *
+ * This function is used to invalidate mm of specific type
+ *
+ */
+void intel_vgpu_invalidate_mm(struct intel_vgpu *vgpu, int type)
+{
+	struct list_head *pos, *n;
+	struct intel_vgpu_mm *mm;
+
+	if (type == INTEL_GVT_MM_PPGTT) {
+		intel_vgpu_invalidate_ggtt(vgpu);
+		return;
+	}
+
+	list_for_each_safe(pos, n, &vgpu->gtt.mm_list_head) {
+		mm = container_of(pos, struct intel_vgpu_mm, list);
+		if (mm->type == INTEL_GVT_MM_PPGTT) {
+			list_del_init(&mm->lru_list);
+			if (mm->has_shadow_page_table && mm->shadowed)
+				invalidate_mm(mm);
+		}
+	}
+}
+
 static int reclaim_one_mm(struct intel_gvt *gvt)
 {
 	struct intel_vgpu_mm *mm;
@@ -2107,7 +2163,7 @@ int intel_vgpu_init_gtt(struct intel_vgpu *vgpu)
 	INIT_LIST_HEAD(&gtt->oos_page_list_head);
 	INIT_LIST_HEAD(&gtt->post_shadow_list_head);
 
-	intel_vgpu_reset_ggtt(vgpu);
+	intel_vgpu_invalidate_ggtt(vgpu);
 
 	ggtt_mm = intel_vgpu_create_mm(vgpu, INTEL_GVT_MM_GGTT,
 			NULL, 1, 0);
@@ -2392,42 +2448,6 @@ void intel_gvt_clean_gtt(struct intel_gvt *gvt)
 }
 
 /**
- * intel_vgpu_reset_ggtt - reset the GGTT entry
- * @vgpu: a vGPU
- *
- * This function is called at the vGPU create stage
- * to reset all the GGTT entries.
- *
- */
-void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu)
-{
-	struct intel_gvt *gvt = vgpu->gvt;
-	struct drm_i915_private *dev_priv = gvt->dev_priv;
-	struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
-	u32 index;
-	u32 offset;
-	u32 num_entries;
-	struct intel_gvt_gtt_entry e;
-
-	memset(&e, 0, sizeof(struct intel_gvt_gtt_entry));
-	e.type = GTT_TYPE_GGTT_PTE;
-	ops->set_pfn(&e, gvt->gtt.scratch_mfn);
-	e.val64 |= _PAGE_PRESENT;
-
-	index = vgpu_aperture_gmadr_base(vgpu) >> PAGE_SHIFT;
-	num_entries = vgpu_aperture_sz(vgpu) >> PAGE_SHIFT;
-	for (offset = 0; offset < num_entries; offset++)
-		ops->set_entry(NULL, &e, index + offset, false, 0, vgpu);
-
-	index = vgpu_hidden_gmadr_base(vgpu) >> PAGE_SHIFT;
-	num_entries = vgpu_hidden_sz(vgpu) >> PAGE_SHIFT;
-	for (offset = 0; offset < num_entries; offset++)
-		ops->set_entry(NULL, &e, index + offset, false, 0, vgpu);
-
-	gtt_invalidate(dev_priv);
-}
-
-/**
  * intel_vgpu_reset_gtt - reset the all GTT related status
  * @vgpu: a vGPU
  *
@@ -2438,12 +2458,6 @@ void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu)
 void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu)
 {
 	ppgtt_free_all_shadow_page(vgpu);
-
-	/* Shadow pages are only created when there is no page
-	 * table tracking data, so remove page tracking data after
-	 * removing the shadow pages.
-	 */
 	intel_vgpu_free_mm(vgpu, INTEL_GVT_MM_PPGTT);
-
-	intel_vgpu_reset_ggtt(vgpu);
+	intel_vgpu_invalidate_ggtt(vgpu);
 }
diff --git a/drivers/gpu/drm/i915/gvt/gtt.h b/drivers/gpu/drm/i915/gvt/gtt.h
index 416b2f8..fc04b14 100644
--- a/drivers/gpu/drm/i915/gvt/gtt.h
+++ b/drivers/gpu/drm/i915/gvt/gtt.h
@@ -185,6 +185,7 @@ extern struct intel_vgpu_mm *intel_vgpu_create_mm(struct intel_vgpu *vgpu,
 		int mm_type, void *virtual_page_table, int page_table_level,
 		u32 pde_base_index);
 extern void intel_vgpu_destroy_mm(struct kref *mm_ref);
+extern void intel_vgpu_invalidate_mm(struct intel_vgpu *vgpu, int type);
 
 struct intel_vgpu_guest_page;
 
@@ -210,11 +211,10 @@ 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);
 
 extern int intel_gvt_init_gtt(struct intel_gvt *gvt);
-void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu);
 extern void intel_gvt_clean_gtt(struct intel_gvt *gvt);
+void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu);
 
 extern struct intel_vgpu_mm *intel_gvt_find_ppgtt_mm(struct intel_vgpu *vgpu,
 		int page_table_level, void *root_entry);
-- 
2.7.4



More information about the intel-gvt-dev mailing list