[PATCH] drm/i915/gvt: cancel dma map only for not present ggtt entry

Xiaolin Zhang xiaolin.zhang at intel.com
Wed May 15 06:05:59 UTC 2019


only cancel ggtt entry dma map for invalid ggtt entry, don't do it
for paritial update or old ggtt entry.

this change can address DMA "fault reason 23" issue for win guest with
intel iommu on.

Signed-off-by: Xiaolin Zhang <xiaolin.zhang at intel.com>
---
 drivers/gpu/drm/i915/gvt/gtt.c | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c
index c2f7d20f6346..6d021d830f37 100644
--- a/drivers/gpu/drm/i915/gvt/gtt.c
+++ b/drivers/gpu/drm/i915/gvt/gtt.c
@@ -2243,7 +2243,12 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
 		}
 	}
 
-	if (!partial_update && (ops->test_present(&e))) {
+	if (!ops->test_present(&e)) {
+		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);
+	} else if (!partial_update && (ops->test_present(&e))) {
 		gfn = ops->get_pfn(&e);
 		m = e;
 
@@ -2266,19 +2271,11 @@ 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 {
-		ops->set_pfn(&m, gvt->gtt.scratch_mfn);
-		ops->clear_present(&m);
 	}
-
 out:
-	ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
-
-	ggtt_get_host_entry(ggtt_mm, &e, g_gtt_index);
-	ggtt_invalidate_pte(vgpu, &e);
-
 	ggtt_set_host_entry(ggtt_mm, &m, g_gtt_index);
 	ggtt_invalidate(gvt->dev_priv);
+	ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
 	return 0;
 }
 
-- 
2.15.1



More information about the intel-gvt-dev mailing list