[PATCH] drm/i915/gvt: Fix an logic issue in ppgtt_allocate_oos_page

Zhi Wang zhi.a.wang at intel.com
Wed Mar 15 09:01:12 UTC 2017


From: Min He <min.he at intel.com>

In ppgtt_allocate_oos_page, when there's no free oos_page, we'll sync an
old oos page and detach it. But that oos page may not belong to current
gvt, so we need to find corresponding gvt and sync to it.

This patch can fix bug 1005.

Signed-off-by: Min He <min.he at intel.com>
Signed-off-by: Zhi Wang <zhi.a.wang at intel.com>
---
 drivers/gpu/drm/i915/gvt/gtt.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c
index da73127..ee77836 100644
--- a/drivers/gpu/drm/i915/gvt/gtt.c
+++ b/drivers/gpu/drm/i915/gvt/gtt.c
@@ -1160,6 +1160,7 @@ static int ppgtt_allocate_oos_page(struct intel_vgpu *vgpu,
 	struct intel_gvt *gvt = vgpu->gvt;
 	struct intel_gvt_gtt *gtt = &gvt->gtt;
 	struct intel_vgpu_oos_page *oos_page = gpt->oos_page;
+	struct intel_vgpu_ppgtt_spt *spt = NULL;
 	int ret;
 
 	WARN(oos_page, "shadow PPGTT page has already has a oos page\n");
@@ -1167,10 +1168,12 @@ static int ppgtt_allocate_oos_page(struct intel_vgpu *vgpu,
 	if (list_empty(&gtt->oos_page_free_list_head)) {
 		oos_page = container_of(gtt->oos_page_use_list_head.next,
 			struct intel_vgpu_oos_page, list);
-		ret = ppgtt_set_guest_page_sync(vgpu, oos_page->guest_page);
+		spt = guest_page_to_ppgtt_spt(oos_page->guest_page);
+		ret = ppgtt_set_guest_page_sync(spt->vgpu,
+				oos_page->guest_page);
 		if (ret)
 			return ret;
-		ret = detach_oos_page(vgpu, oos_page);
+		ret = detach_oos_page(spt->vgpu, oos_page);
 		if (ret)
 			return ret;
 	} else
-- 
1.9.1



More information about the intel-gvt-dev mailing list