[Intel-gfx] [PATCH 2/4] drm/i915: Directly steal fence register in i915_find_fence_reg()

Zhi Wang zhi.a.wang at intel.com
Tue Jun 28 13:51:43 UTC 2016


A client like GVT-g will request fence register from host when creating
vGPUs. According to Chris's comments, we'd better not expose the fence
stealing function as a dedicated API as the caller may not know if the
fence register could be stealed without touching the inner pin_count.

This patch merges the fence stealing parts into i915_find_fence_reg().

Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin at linux.intel.com>
Cc: Chris Wilson <chris at chris-wilson.co.uk>
Signed-off-by: Zhi Wang <zhi.a.wang at intel.com>
---
 drivers/gpu/drm/i915/i915_gem_fence.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_fence.c b/drivers/gpu/drm/i915/i915_gem_fence.c
index 1dfb09b..7a5a02c 100644
--- a/drivers/gpu/drm/i915/i915_gem_fence.c
+++ b/drivers/gpu/drm/i915/i915_gem_fence.c
@@ -313,7 +313,7 @@ i915_find_fence_reg(struct drm_device *dev)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct drm_i915_fence_reg *reg, *avail;
-	int i;
+	int i, ret;
 
 	/* First try to find a free reg */
 	avail = NULL;
@@ -333,6 +333,15 @@ i915_find_fence_reg(struct drm_device *dev)
 		if (reg->pin_count)
 			continue;
 
+		if (reg->obj) {
+			struct drm_i915_gem_object *old = reg->obj;
+
+			ret = i915_gem_object_wait_fence(old);
+			if (ret)
+				return ERR_PTR(ret);
+
+			i915_gem_object_fence_lost(old);
+		}
 		return reg;
 	}
 
@@ -395,16 +404,6 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj)
 		reg = i915_find_fence_reg(dev);
 		if (IS_ERR(reg))
 			return PTR_ERR(reg);
-
-		if (reg->obj) {
-			struct drm_i915_gem_object *old = reg->obj;
-
-			ret = i915_gem_object_wait_fence(old);
-			if (ret)
-				return ret;
-
-			i915_gem_object_fence_lost(old);
-		}
 	} else
 		return 0;
 
-- 
1.9.1



More information about the Intel-gfx mailing list