[Intel-gfx] [PATCH 2/5] drm/i915: Allow asynchronous waits on the i915_active barriers
Chris Wilson
chris at chris-wilson.co.uk
Mon Apr 6 13:09:44 UTC 2020
Quoting Tvrtko Ursulin (2020-04-06 13:06:03)
>
> On 06/04/2020 10:12, Chris Wilson wrote:
> > Allow the caller to also wait upon the barriers stored in i915_active.
> >
> > Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> > ---
> > drivers/gpu/drm/i915/i915_active.c | 60 ++++++++++++++++++++++++++++++
> > drivers/gpu/drm/i915/i915_active.h | 1 +
> > 2 files changed, 61 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_active.c b/drivers/gpu/drm/i915/i915_active.c
> > index d5e24be759f7..048ab9edd2c2 100644
> > --- a/drivers/gpu/drm/i915/i915_active.c
> > +++ b/drivers/gpu/drm/i915/i915_active.c
> > @@ -542,6 +542,55 @@ static int __await_active(struct i915_active_fence *active,
> > return 0;
> > }
> >
> > +struct wait_barrier {
> > + struct wait_queue_entry base;
> > + struct i915_active *ref;
> > +};
> > +
> > +static int
> > +barrier_wake(wait_queue_entry_t *wq, unsigned int mode, int flags, void *key)
> > +{
> > + struct wait_barrier *wb = container_of(wq, typeof(*wb), base);
> > +
> > + if (i915_active_is_idle(wb->ref)) { /* shared waitqueue, must check! */
>
> Who shares it?
__var_waitqueue(ref) => uses a one of a set of global workqueues based
off hash(ref)
Or we add a wait_queue_head_t to active, but we would still need to
recheck as it may be reused as we are signaled.
> > + if (flags & I915_ACTIVE_AWAIT_BARRIER) {
> > + err = flush_lazy_signals(ref);
> > + if (err)
> > + return err;
> > +
> > + err = __await_barrier(ref, arg);
> > + if (err)
> > + return err;
> >
>
> Could have a single set of active_acquire_if_busy/release over the
> previous and this new block. Not sure if that would help with any
> atomicity concerns, or if there are such.
It would not affect correctness, it will just depend on taste.
> + }
> > +
> > return 0;
> > }
> >
> > @@ -582,6 +641,7 @@ int i915_request_await_active(struct i915_request *rq,
> > struct i915_active *ref,
> > unsigned int flags)
> > {
> > + GEM_BUG_ON(flags & I915_ACTIVE_AWAIT_BARRIER);
>
> Why is this an error?
Because I'm being lazy and not hooking up the correct signaling path.
Instead of signaling arg == fence, we would need &request->submit. Just
messy on how to pass down the details.
Maybe
return await_active(ref, flags, rq_await_fence, rq, &rq->submit);
and
return await_active(ref, flags, sw_await_fence, fence, fence);
That seems better than I was expecting.
-Chris
More information about the Intel-gfx
mailing list