In commit 69c2fc891343cb5217c866d10709343cff190bdc Author: Chris Wilson <chris at chris-wilson.co.uk> Date: Fri Jul 20 12:41:03 2012 +0100 drm/i915: Remove the per-ring write list the explicit flush was removed from i915_ring_idle(). However, we continued to wait upon the next seqno which now did not correspond to any request (except for the unusual condition of a failure to queue a request after execbuffer) and so would wait indefinitely. Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk> --- drivers/gpu/drm/i915/i915_gem.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 94a9ada..39de523 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -2596,16 +2596,24 @@ static int i915_ring_idle(struct intel_ring_buffer *ring) u32 seqno; int ret; - if (list_empty(&ring->active_list)) - return 0; + /* We need to add any requests required to flush the objects */ + if (!list_empty(&ring->active_list)) { + seqno = list_entry(ring->active_list.prev, + struct drm_i915_gem_object, + ring_list)->last_read_seqno; - seqno = list_last_entry(&ring->active_list, - struct drm_i915_gem_object, - ring_list)->last_read_seqno; + ret = i915_gem_check_olr(ring, seqno); + if (ret) + return ret; + } - ret = i915_gem_check_olr(ring, seqno); - if (ret) - return ret; + /* Wait upon the last request to be completed */ + if (list_empty(&ring->request_list)) + return 0; + + seqno = list_entry(ring->request_list.prev, + struct drm_i915_gem_request, + list)->seqno; return i915_wait_seqno(ring, seqno); } -- 1.7.10.4