[Intel-gfx] [PATCH 21/31] drm/i915: Convert engine->write_tail to operate on a request

Dave Gordon david.s.gordon at intel.com
Thu Jul 28 15:05:28 UTC 2016


On 27/07/16 13:29, Chris Wilson wrote:
> On Wed, Jul 27, 2016 at 12:53:25PM +0100, Dave Gordon wrote:
>> On 25/07/16 08:44, Chris Wilson wrote:
>>> If we rewrite the I915_WRITE_TAIL specialisation for the legacy
>>> ringbuffer as submitting the request onto the ringbuffer, we can unify
>>> the vfunc with both execlists and GuC in the next patch.
>>>
>>> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
>>> Reviewed-by: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
>>> ---
>>> drivers/gpu/drm/i915/i915_gem_request.c |  8 ++---
>>> drivers/gpu/drm/i915/intel_lrc.c        |  2 +-
>>> drivers/gpu/drm/i915/intel_ringbuffer.c | 53 +++++++++++++++++----------------
>>> drivers/gpu/drm/i915/intel_ringbuffer.h |  3 +-
>>> 4 files changed, 32 insertions(+), 34 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c
>>> index 1c185e293bf0..8814e9c5266b 100644
>>> --- a/drivers/gpu/drm/i915/i915_gem_request.c
>>> +++ b/drivers/gpu/drm/i915/i915_gem_request.c
>>> @@ -467,15 +467,13 @@ void __i915_add_request(struct drm_i915_gem_request *request,
>>> 	 */
>>> 	request->postfix = ring->tail;
>>>
>>> -	if (i915.enable_execlists) {
>>> +	if (i915.enable_execlists)
>>> 		ret = engine->emit_request(request);
>>> -	} else {
>>> +	else
>>> 		ret = engine->add_request(request);
>>> -
>>> -		request->tail = ring->tail;
>>> -	}
>>> 	/* Not allowed to fail! */
>>> 	WARN(ret, "emit|add_request failed: %d!\n", ret);
>>> +
>>> 	/* Sanity check that the reserved size was large enough. */
>>> 	ret = ring->tail - request_start;
>>> 	if (ret < 0)
>>> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
>>> index 567d94de3300..250edb2bcef7 100644
>>> --- a/drivers/gpu/drm/i915/intel_lrc.c
>>> +++ b/drivers/gpu/drm/i915/intel_lrc.c
>>> @@ -373,7 +373,7 @@ static void execlists_update_context(struct drm_i915_gem_request *rq)
>>> 	struct i915_hw_ppgtt *ppgtt = rq->ctx->ppgtt;
>>> 	uint32_t *reg_state = rq->ctx->engine[engine->id].lrc_reg_state;
>>>
>>> -	reg_state[CTX_RING_TAIL+1] = rq->tail;
>>> +	reg_state[CTX_RING_TAIL+1] = rq->tail % (rq->ring->size - 1);
>>
>> mod ringsize-1 ?
>>
>> Surely tail % ringsize, or tail & (ringsize-1).
>>
>> But it's redundant anyway, rq->tail cannot exceed ring->size,
>> so the original code was correct.
>
> No, rq->tail can be equal to ring->size which leads to a GPU hang.
> (Observed on the older gen at least, I'd rather have the same paranoia
> here.)
> -Chris

Even if it's not redundant, it's still the wrong number. The code above 
would result in tail (==size) being converted to 1 rather than 0.

If it's a % operation, it should be ringsize not ringsize-1. Or convert 
to an & operation with ringsize-1.

.Dave.


More information about the Intel-gfx mailing list