From 4266a03f7bacd433b3f4d9574cb83fbce42242e6 Mon Sep 17 00:00:00 2001 From: Ben Widawsky Date: Thu, 26 Apr 2012 16:03:03 -0700 Subject: [PATCH] --- yaml --- r: 307326 b: refs/heads/master c: 604dd3ec75b2488dc81cd25dd85fcea23df25a9e h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/gpu/drm/i915/i915_gem.c | 49 +++++++++++++++++---------- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/[refs] b/[refs] index 7acc591cfe63..89ca34c642a0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c58cf4f1082d81c42be89e9c6eeca6466954a70c +refs/heads/master: 604dd3ec75b2488dc81cd25dd85fcea23df25a9e diff --git a/trunk/drivers/gpu/drm/i915/i915_gem.c b/trunk/drivers/gpu/drm/i915/i915_gem.c index 148e04baceba..b7a99bfa423d 100644 --- a/trunk/drivers/gpu/drm/i915/i915_gem.c +++ b/trunk/drivers/gpu/drm/i915/i915_gem.c @@ -1819,6 +1819,36 @@ i915_gem_retire_work_handler(struct work_struct *work) mutex_unlock(&dev->struct_mutex); } +static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno, + bool interruptible) +{ + drm_i915_private_t *dev_priv = ring->dev->dev_private; + int ret = 0; + + if (i915_seqno_passed(ring->get_seqno(ring), seqno)) + return 0; + + trace_i915_gem_request_wait_begin(ring, seqno); + if (WARN_ON(!ring->irq_get(ring))) + return -ENODEV; + +#define EXIT_COND \ + (i915_seqno_passed(ring->get_seqno(ring), seqno) || \ + atomic_read(&dev_priv->mm.wedged)) + + if (interruptible) + ret = wait_event_interruptible(ring->irq_queue, + EXIT_COND); + else + wait_event(ring->irq_queue, EXIT_COND); + + ring->irq_put(ring); + trace_i915_gem_request_wait_end(ring, seqno); +#undef EXIT_COND + + return ret; +} + /** * Waits for a sequence number to be signaled, and cleans up the * request and object lists appropriately for that event. @@ -1861,24 +1891,7 @@ i915_wait_request(struct intel_ring_buffer *ring, seqno = request->seqno; } - if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) { - trace_i915_gem_request_wait_begin(ring, seqno); - - if (WARN_ON(!ring->irq_get(ring))) - return -ENODEV; - - if (dev_priv->mm.interruptible) - ret = wait_event_interruptible(ring->irq_queue, - i915_seqno_passed(ring->get_seqno(ring), seqno) - || atomic_read(&dev_priv->mm.wedged)); - else - wait_event(ring->irq_queue, - i915_seqno_passed(ring->get_seqno(ring), seqno) - || atomic_read(&dev_priv->mm.wedged)); - - ring->irq_put(ring); - trace_i915_gem_request_wait_end(ring, seqno); - } + ret = __wait_seqno(ring, seqno, dev_priv->mm.interruptible); if (atomic_read(&dev_priv->mm.wedged)) ret = -EAGAIN;