[Intel-gfx] [PATCH v3] drm/i915: Copy across scheduler behaviour flags across submit fences

Chris Wilson chris at chris-wilson.co.uk
Tue Dec 10 14:29:08 UTC 2019


Quoting Tvrtko Ursulin (2019-12-10 14:12:31)
> 
> On 10/12/2019 13:06, Chris Wilson wrote:
> > Quoting Tvrtko Ursulin (2019-12-10 12:41:36)
> >>
> >> On 04/12/2019 21:17, Chris Wilson wrote:
> >>> +static int
> >>> +__i915_request_await_execution(struct i915_request *to,
> >>> +                            struct i915_request *from,
> >>> +                            void (*hook)(struct i915_request *rq,
> >>> +                                         struct dma_fence *signal))
> >>> +{
> >>> +     int err;
> >>> +
> >>> +     /* Submit both requests at the same time */
> >>> +     err = __await_execution(to, from, hook, I915_FENCE_GFP);
> >>> +     if (err)
> >>> +             return err;
> >>> +
> >>> +     if (!to->engine->schedule)
> >>> +             return 0;
> >>
> >> Hm is this about scheduler or preemption?
> > 
> > It's about dependency tracking, and the lack of it.
> >   
> >>> +
> >>> +     /* Squash repeated depenendices to the same timelines */
> >>
> >> typo in dependencies
> >>
> >>> +     if (intel_timeline_sync_has_start(i915_request_timeline(to),
> >>> +                                       &from->fence))
> >>> +             return 0;
> >>> +
> >>> +     /* Ensure both start together [after all semaphores in signal] */
> >>> +     if (intel_engine_has_semaphores(to->engine))
> >>> +             err =__emit_semaphore_wait(to, from, from->fence.seqno - 1);
> >>
> >> So the only thing preventing B' getting onto the same engine as A, as
> >> soon as B enters a different engine, is the priority order?
> > 
> > No. Now B' has a dependency on A, so B' is always after A.
> 
> Yes, true.
> 
> >> And if I am reading this correctly, change relative to current state is
> >> to let B' in, but spin on a semaphore, where currently we let it execute
> >> the actual payload.
> >>
> >> It's possible that we do need this if we said we would guarantee bonded
> >> request would not execute before it's master. Have we made this
> >> guarantee when discussing the uAPI? We must had..
> > 
> > We did not make that guarantee as the assumption was that all fences for
> > B would be passed to B'. However, the since fence slot for IN/SUBMIT
> 
> I think we must have made a guarantee B' won't start executing before B. 
> That is kind of the central point. Only thing we did not do is 
> guarantee/made effort to start B' together with B. But guarantee got 
> defeated by ELSP and later timeslicing/preemption.

According to the implementation, we did not ;)

I agree that the stronger coordination makes more sense for the API, and
the inheritance of dependencies I think is crucial for exported fences.
 
> Previously, miss was if B was in ELSP[1] B' could be put in ELSP[0] 
> (different engines). Which is wrong. And with timeslicing/preemption 
> even more so.

It wasn't actually an oversight :) My understanding was that B' payload
would not start before B payload via user semaphores, so I wrote it off
as a bad bubble.

The oversight, imo, is that we shouldn't rely on userspace for this and
with the current implementation it is easy to lose PI.
 
> So having await_started or semaphore looks correct in that respect. And 
> scheduler deps cover the A in chain. So I think it's good with this patch.

Agreed.
-Chris


More information about the Intel-gfx mailing list