Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 307326
b: refs/heads/master
c: 604dd3e
h: refs/heads/master
v: v3
  • Loading branch information
Ben Widawsky authored and Daniel Vetter committed May 3, 2012
1 parent 3ae4693 commit 4266a03
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 19 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c58cf4f1082d81c42be89e9c6eeca6466954a70c
refs/heads/master: 604dd3ec75b2488dc81cd25dd85fcea23df25a9e
49 changes: 31 additions & 18 deletions trunk/drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit 4266a03

Please sign in to comment.