We are conservative on the amount of free space available in the ring to avoid overruning the potential MI_INTERRUPT after the seqno write. Further undermining the justification for the change was that it was applied incorrectly. Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> --- drivers/gpu/drm/i915/i915_drv.h | 14 ++------------ drivers/gpu/drm/i915/i915_gem.c | 11 ++--------- drivers/gpu/drm/i915/i915_gpu_error.c | 2 +- drivers/gpu/drm/i915/intel_lrc.c | 6 ++---- drivers/gpu/drm/i915/intel_ringbuffer.c | 2 +- 5 files changed, 8 insertions(+), 27 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 0d61215f2817..8d6827347fef 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -2055,18 +2055,8 @@ struct drm_i915_gem_request { /** GEM sequence number associated with this request. */ uint32_t seqno; - /** Position in the ringbuffer of the start of the request */ - u32 head; - - /** - * Position in the ringbuffer of the start of the postfix. - * This is required to calculate the maximum available ringbuffer - * space without overwriting the postfix. - */ - u32 postfix; - - /** Position in the ringbuffer of the end of the whole request */ - u32 tail; + /** Position in the ringbuffer of the request */ + u32 head, tail; /** * Context and ring buffer related to this request diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index abd858701307..5fef69b2ce9f 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1369,7 +1369,7 @@ __i915_gem_request_retire__upto(struct drm_i915_gem_request *rq) if (list_empty(&rq->list)) return; - rq->ringbuf->last_retired_head = rq->postfix; + rq->ringbuf->last_retired_head = rq->tail; do { struct drm_i915_gem_request *prev = @@ -2439,13 +2439,6 @@ int __i915_add_request(struct intel_engine_cs *ring, return ret; } - /* Record the position of the start of the request so that - * should we detect the updated seqno part-way through the - * GPU processing the request, we never over-estimate the - * position of the head. - */ - request->postfix = intel_ring_get_tail(ringbuf); - if (i915.enable_execlists) { ret = ring->emit_request(ringbuf, request); if (ret) @@ -2747,7 +2740,7 @@ i915_gem_retire_requests_ring(struct intel_engine_cs *ring) * of tail of the request to update the last known position * of the GPU head. */ - request->ringbuf->last_retired_head = request->postfix; + request->ringbuf->last_retired_head = request->tail; i915_gem_request_retire(request); } diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 8832f1b2a495..b7a00e464ba4 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c @@ -1072,7 +1072,7 @@ static void i915_gem_record_rings(struct drm_device *dev, erq = &error->ring[i].requests[count++]; erq->seqno = request->seqno; erq->jiffies = request->emitted_jiffies; - erq->tail = request->postfix; + erq->tail = request->tail; } } } diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index 940dbaece3ae..8fa44c3e8c3c 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c @@ -407,7 +407,6 @@ void intel_lrc_irq_handler(struct intel_engine_cs *ring) static int execlists_context_queue(struct intel_engine_cs *ring, struct intel_context *to, - u32 tail, struct drm_i915_gem_request *request) { if (WARN_ON(request == NULL)) @@ -419,8 +418,6 @@ static int execlists_context_queue(struct intel_engine_cs *ring, i915_gem_request_reference(request); WARN_ON(to != request->ctx); - request->tail = tail; - spin_lock_irq(&ring->execlist_lock); list_add_tail(&request->execlist_link, &ring->execlist_queue); @@ -696,7 +693,8 @@ intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf, if (intel_ring_stopped(ring)) return; - execlists_context_queue(ring, ctx, ringbuf->tail, request); + request->tail = ringbuf->tail; + execlists_context_queue(ring, ctx, request); } static int intel_lr_context_pin(struct intel_engine_cs *ring, diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 6003e13e05b6..f44e7be17104 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c @@ -2106,7 +2106,7 @@ static int ring_wait_for_space(struct intel_engine_cs *ring, int n) return 0; list_for_each_entry(request, &ring->request_list, list) { - space = __intel_ring_space(request->postfix, ringbuf->tail, + space = __intel_ring_space(request->tail, ringbuf->tail, ringbuf->size); if (space >= n) break; -- 2.1.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx