[Intel-gfx] [PATCH] drm/i915/execlists: Skip lite restore on the currently executing request

Chris Wilson chris at chris-wilson.co.uk
Wed Apr 25 11:23:30 UTC 2018


Quoting Mika Kuoppala (2018-04-25 12:19:08)
> Chris Wilson <chris at chris-wilson.co.uk> writes:
> 
> > When WaIdleLiteRestore isn't enough.
> >
> > Fixes an odd hang on gen8 (both bsw and bdw) during gem_ctx_switch,
> 
> Do you have a testcase name? (testcase tag would be nice too)

Just keep running gem_ctx_switch. Switching between the static set of
contexts, no rebind pressure whatsoever.

> > where by all intents and purposes if we trigger a lite-restore as it is
> > processing the pipecontrol flushes, the RING is restored to the oword
> 
> s/RING/RING_HEAD ?
> 
> > following the command and tries to execute the destination address for
> > the pipecontrol rather than a valid command. With the theory being that
> > it doesn't like RING_HEAD being within a cacheline of the restored
> > RING_TAIL, we can evade that issue by not triggering a lite-restore if
> > we know we are inside the last request.
> >
> > Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> > ---
> >  drivers/gpu/drm/i915/intel_lrc.c | 13 +++++++++++++
> >  1 file changed, 13 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> > index 029901a8fa38..5c50263e45d3 100644
> > --- a/drivers/gpu/drm/i915/intel_lrc.c
> > +++ b/drivers/gpu/drm/i915/intel_lrc.c
> > @@ -639,6 +639,19 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
> >               if (port_count(&port[1]))
> >                       goto unlock;
> >  
> > +             /*
> > +              * Skip invoking a lite-restore if we know we have already
> > +              * started processing the last request queued to HW. This
> > +              * prevents a mystery *unrecoverable* hang on gen8, maybe
> > +              * related to updating TAIL within a cacheline of HEAD? (As
> 
> Did you try with WA_TAIL_DWORDS 16?

Sure can try, but the error state doesn't indicate TAIL==HEAD as would
be the issue with WaIdleLiteRestore (restoring to an idle ring wouldn't
generate the arbitration event, so no more context switches).
-Chris


More information about the Intel-gfx mailing list