[PATCH] drm/i915: Protect active fences on i915

Chris Wilson chris at chris-wilson.co.uk
Sun Feb 8 06:19:22 PST 2009


The i915 also uses the fence registers for GPU access to tiled buffers so
we cannot reallocate one whilst it is on the active list. By performing a
LRU scan of the fenced buffers we also avoid waiting the possibility of
waiting on a pinned, or otherwise unusable, buffer.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_gem.c |   38 +++++++++++++++++++++++++++++---------
 1 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 4cfc5e6..3e01449 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1588,18 +1588,31 @@ try_again:
 
 	/* None available, try to steal one or wait for a user to finish */
 	if (i == dev_priv->num_fence_regs) {
+		uint32_t seqno = dev_priv->mm.next_gem_seqno;
 		loff_t offset;
 
 		if (avail == 0)
 			return -ENOMEM;
 
-		/* Could try to use LRU here instead... */
 		for (i = dev_priv->fence_reg_start;
 		     i < dev_priv->num_fence_regs; i++) {
+			uint32_t this_seqno;
+
 			reg = &dev_priv->fence_regs[i];
 			old_obj_priv = reg->obj->driver_private;
-			if (!old_obj_priv->pin_count)
+
+			if (old_obj_priv->pin_count)
+				continue;
+
+			/* i915 uses fences for GPU access to tiled buffers */
+			if (IS_I965G(dev) || !old_obj_priv->active)
 				break;
+
+			this_seqno = old_obj_priv->last_rendering_seqno;
+			if (this_seqno != 0 &&
+			    reg->obj->write_domain == 0 &&
+			    i915_seqno_passed(seqno, this_seqno))
+				seqno = this_seqno;
 		}
 
 		/*
@@ -1608,15 +1621,22 @@ try_again:
 		 */
 		if (i == dev_priv->num_fence_regs) {
 #if WATCH_FENCE
-			DRM_INFO("%s: waiting for fence (waiting on %p)\n",
-				 __func__, reg->obj);
+			DRM_INFO("%s: waiting for fence\n", __func__);
 #endif
-			ret = i915_gem_object_set_to_gtt_domain(reg->obj, 0);
-			if (ret) {
-				WARN(ret != -ERESTARTSYS,
-				     "switch to GTT domain failed: %d\n", ret);
-				return ret;
+			if (seqno == dev_priv->mm.next_gem_seqno) {
+				i915_gem_flush(dev,
+					       ~(I915_GEM_DOMAIN_CPU|I915_GEM_DOMAIN_GTT),
+					       ~(I915_GEM_DOMAIN_CPU|I915_GEM_DOMAIN_GTT));
+				seqno = i915_add_request(dev,
+							 ~I915_GEM_DOMAIN_CPU);
+				if (seqno == 0)
+					return -ENOMEM;
 			}
+
+			ret = i915_wait_request(dev, seqno);
+			if (ret)
+				return ret;
+
 			goto try_again;
 		}
 
-- 
1.6.0.4


--=-jw+eGx1Z7Uv+RKG3jhJW
Content-Disposition: attachment; filename="0021-drm-i915-Flush-GPU-access-to-the-old-fence-on-i915.patch"
Content-Type: text/x-patch; name="0021-drm-i915-Flush-GPU-access-to-the-old-fence-on-i915.patch"; charset="UTF-8"
Content-Transfer-Encoding: 7bit



More information about the Intel-gfx mailing list