[Intel-gfx] [PATCH] drm/i915/execlists: Drop request-before-CS assertion

Mika Kuoppala mika.kuoppala at linux.intel.com
Wed Apr 22 16:04:13 UTC 2020


Chris Wilson <chris at chris-wilson.co.uk> writes:

> When we migrated to execlists, one of the conditions we wanted to test
> for was whether the breadcrumb seqno was being written before the
> breadcumb interrupt was delivered. This was following on from issues
> observed on previous generations which were not so strong ordered. With

strongly?

> the removal of the missed interrupt detection, we have not reliable
> means of detecting the out-of-order seqno/interupt but instead tried to
interrupt

> assert that the relationship between the CS event interrupt and the
> breadwrite should be strongly ordered. However, Icelake proves it is
> possible for the HW implementation to forget about minor little details
> such as write ordering and so we the order between *processing* the CS

s/we//

> event and the breadcrumb is unreliable.
>
> Remove the unreliable assertion, but leave a debug telltale in case we
> have reason to suspect.
>
> Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/1658
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/gt/intel_lrc.c | 27 ++-------------------------
>  1 file changed, 2 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
> index d42a9d6767d4..eb0d6f1964f4 100644
> --- a/drivers/gpu/drm/i915/gt/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
> @@ -2384,13 +2384,6 @@ gen8_csb_parse(const struct intel_engine_execlists *execlists, const u32 *csb)
>  	return *csb & (GEN8_CTX_STATUS_IDLE_ACTIVE | GEN8_CTX_STATUS_PREEMPTED);
>  }
>  
> -static inline void flush_hwsp(const struct i915_request *rq)
> -{
> -	mb();
> -	clflush((void *)READ_ONCE(rq->hwsp_seqno));
> -	mb();
> -}
> -
>  static void process_csb(struct intel_engine_cs *engine)
>  {
>  	struct intel_engine_execlists * const execlists = &engine->execlists;
> @@ -2506,19 +2499,8 @@ static void process_csb(struct intel_engine_cs *engine)
>  				const u32 *regs __maybe_unused =
>  					rq->context->lrc_reg_state;
>  

The comment above this scope is quite strong about
strong ordering so that might need amending too.

Reviewed-by: Mika Kuoppala <mika.kuoppala at linux.intel.com>


> -				/*
> -				 * Flush the breadcrumb before crying foul.
> -				 *
> -				 * Since we have hit this on icl and seen the
> -				 * breadcrumb advance as we print out the debug
> -				 * info (so the problem corrected itself without
> -				 * lasting damage), and we know that icl suffers
> -				 * from missing global observation points in
> -				 * execlists, presume that affects even more
> -				 * coherency.
> -				 */
> -				flush_hwsp(rq);
> -
> +				ENGINE_TRACE(engine,
> +					     "context completed before request!\n");
>  				ENGINE_TRACE(engine,
>  					     "ring:{start:0x%08x, head:%04x, tail:%04x, ctl:%08x, mode:%08x}\n",
>  					     ENGINE_READ(engine, RING_START),
> @@ -2538,11 +2520,6 @@ static void process_csb(struct intel_engine_cs *engine)
>  					     regs[CTX_RING_START],
>  					     regs[CTX_RING_HEAD],
>  					     regs[CTX_RING_TAIL]);
> -
> -				/* Still? Declare it caput! */
> -				if (!i915_request_completed(rq) &&
> -				    !reset_in_progress(execlists))
> -					GEM_BUG_ON("context completed before request");
>  			}
>  
>  			execlists_schedule_out(*execlists->active++);
> -- 
> 2.20.1


More information about the Intel-gfx mailing list