[Intel-gfx] [PATCH 02/17] drm/i915/ringbuffer: Brute force context restore

Chris Wilson chris at chris-wilson.co.uk
Mon Jun 11 10:04:55 UTC 2018


Quoting Tvrtko Ursulin (2018-06-11 11:00:31)
> 
> On 10/06/2018 20:43, Chris Wilson wrote:
> > @@ -1585,11 +1607,14 @@ static int switch_context(struct i915_request *rq)
> >   
> >               to_mm->pd_dirty_rings &= ~intel_engine_flag(engine);
> >               engine->legacy_active_ppgtt = to_mm;
> > -             hw_flags = MI_FORCE_RESTORE;
> > +
> > +             if (to_ctx == from_ctx) {
> 
> Contexts can be the same here , when the parent condition is "if (to_mm 
> != from_mm || to_mm ...)" ?
> 
> > +                     hw_flags = MI_FORCE_RESTORE;
> > +                     from_ctx = NULL;
> 
> Now on the error path we can end up with engine->legacy_active_context 
> == NULL, but commands to switch have been put to the ring. Is that OK?

On the error path, we unwind the commands in the ring and will overwrite
them with the next request (see i915_request_alloc() err_unwind:)

So leaving legacy_active_context = NULL here just ensures we emit a
context switch next time, no matter what. That is no bad thing as the HW
ignores redundant MI_SET_CONTEXT (and requires the FORCE_RESTORE flag to
force a redundant reload).
-Chris


More information about the Intel-gfx mailing list