public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
* [PATCH v2] drm/i915: Optimistically spin for the request completion
@ 2015-03-11 15:29 Chris Wilson
  2015-03-11 21:18 ` Chris Wilson
  2015-03-11 23:07 ` [PATCH v2] " shuang.he
  0 siblings, 2 replies; 29+ messages in thread
From: Chris Wilson @ 2015-03-11 15:29 UTC (permalink / raw)
  To: intel-gfx; +Cc: Daniel Vetter

This provides a nice boost to mesa in swap bound scenarios (as mesa
throttles itself to the previous frame and given the scenario that will
complete shortly). It will also provide a good boost to systems running
with semaphores disabled and so frequently waiting on the GPU as it
switches rings. In the most favourable of microbenchmarks, this can
increase performance by around 15% - though in practice improvements
will be marginal and rarely noticeable.

v2: Account for user timeouts

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
---
 drivers/gpu/drm/i915/i915_gem.c | 47 +++++++++++++++++++++++++++++++++++------
 1 file changed, 41 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index de15bd319bd0..f8895ed368cb 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1191,6 +1191,32 @@ static bool missed_irq(struct drm_i915_private *dev_priv,
 	return test_bit(ring->id, &dev_priv->gpu_error.missed_irq_rings);
 }
 
+static int __i915_spin_request(struct drm_i915_gem_request *req,
+			       unsigned long timeout)
+{
+	struct intel_engine_cs *ring = i915_gem_request_get_ring(req);
+	struct drm_i915_private *dev_priv = to_i915(ring->dev);
+	int ret = -EBUSY;
+
+	intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
+	while (!need_resched()) {
+		if (i915_gem_request_completed(req, true)) {
+			ret = 0;
+			goto out;
+		}
+
+		if (timeout && time_after_eq(jiffies, timeout))
+			break;
+
+		cpu_relax_lowlatency();
+	}
+	if (i915_gem_request_completed(req, false))
+		ret = 0;
+out:
+	intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
+	return ret;
+}
+
 /**
  * __i915_wait_request - wait until execution of request has finished
  * @req: duh!
@@ -1235,12 +1261,20 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
 	if (ring->id == RCS && INTEL_INFO(dev)->gen >= 6)
 		gen6_rps_boost(dev_priv, file_priv);
 
-	if (!irq_test_in_progress && WARN_ON(!ring->irq_get(ring)))
-		return -ENODEV;
-
 	/* Record current time in case interrupted by signal, or wedged */
 	trace_i915_gem_request_wait_begin(req);
 	before = ktime_get_raw_ns();
+
+	/* Optimistic spin before touching IRQs */
+	ret = __i915_spin_request(req, timeout_expire);
+	if (ret == 0)
+		goto out;
+
+	if (!irq_test_in_progress && WARN_ON(!ring->irq_get(ring))) {
+		ret = -ENODEV;
+		goto out;
+	}
+
 	for (;;) {
 		struct timer_list timer;
 
@@ -1289,14 +1323,15 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
 			destroy_timer_on_stack(&timer);
 		}
 	}
-	now = ktime_get_raw_ns();
-	trace_i915_gem_request_wait_end(req);
-
 	if (!irq_test_in_progress)
 		ring->irq_put(ring);
 
 	finish_wait(&ring->irq_queue, &wait);
 
+out:
+	now = ktime_get_raw_ns();
+	trace_i915_gem_request_wait_end(req);
+
 	if (timeout) {
 		s64 tres = *timeout - (now - before);
 
-- 
2.1.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 29+ messages in thread

end of thread, other threads:[~2015-03-23  9:10 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-11 15:29 [PATCH v2] drm/i915: Optimistically spin for the request completion Chris Wilson
2015-03-11 21:18 ` Chris Wilson
2015-03-12  9:07   ` Chris Wilson
2015-03-12  9:17   ` Daniel Vetter
2015-03-12 11:11     ` [PATCH v3] " Chris Wilson
2015-03-12 12:06       ` Chris Wilson
2015-03-12 13:14       ` Tvrtko Ursulin
2015-03-12 13:18         ` Chris Wilson
2015-03-12 15:18           ` Tvrtko Ursulin
2015-03-12 16:28             ` Chris Wilson
2015-03-12 16:41               ` Tvrtko Ursulin
2015-03-12 16:50                 ` Chris Wilson
2015-03-12 17:32                   ` Tvrtko Ursulin
2015-03-13  9:33                     ` Daniel Vetter
2015-03-12 19:27       ` shuang.he
2015-03-19 15:16       ` Chris Wilson
2015-03-20 14:54         ` Daniel Vetter
2015-03-20 15:27           ` Chris Wilson
2015-03-20 14:36       ` [PATCH v4] " Chris Wilson
2015-03-20 16:01         ` Tvrtko Ursulin
2015-03-20 16:19           ` Chris Wilson
2015-03-20 16:31             ` Tvrtko Ursulin
2015-03-23  8:29               ` Daniel Vetter
2015-03-20 22:59             ` Chris Wilson
2015-03-21  9:49               ` Chris Wilson
2015-03-23  8:31               ` Daniel Vetter
2015-03-23  9:09                 ` Chris Wilson
2015-03-20 21:30         ` shuang.he
2015-03-11 23:07 ` [PATCH v2] " shuang.he

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox