[Intel-gfx] [PATCH] drm/i915: Remove the impedance mismatch around intel_engine_enable_signaling
Chris Wilson
chris at chris-wilson.co.uk
Fri Mar 9 17:33:14 UTC 2018
Quoting Tvrtko Ursulin (2018-03-09 17:24:33)
>
> On 08/03/2018 14:07, Chris Wilson wrote:
> > There is some redundancy between dma_fence->ops->enable_signaling (via
> > i915_fence_enable_signaling) and our backend,
> > intel_engine_enable_signaling() in that both levels recheck the fence
> > status multiple times. If we convert intel_engine_enable_signaling() to
> > return the information desired by dma_fence->ops->enable_signaling, we
> > can reduce i915_fence_enable_signaling to a simple stub and avoid
> > trying to reinterpret the same information.
> >
> > Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> > Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> > Cc: Mika Kuoppala <mika.kuoppala at intel.com>
> > Cc: Michal Winiarski <michal.winiarski at intel.com>
> > ---
> > drivers/gpu/drm/i915/i915_request.c | 6 +-----
> > drivers/gpu/drm/i915/intel_breadcrumbs.c | 21 +++++++++++++--------
> > drivers/gpu/drm/i915/intel_ringbuffer.h | 2 +-
> > 3 files changed, 15 insertions(+), 14 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
> > index d437beac3969..2a841800d4cf 100644
> > --- a/drivers/gpu/drm/i915/i915_request.c
> > +++ b/drivers/gpu/drm/i915/i915_request.c
> > @@ -59,11 +59,7 @@ static bool i915_fence_signaled(struct dma_fence *fence)
> >
> > static bool i915_fence_enable_signaling(struct dma_fence *fence)
> > {
> > - if (i915_fence_signaled(fence))
> > - return false;
>
> This was based on hws seqno check...
>
> > -
> > - intel_engine_enable_signaling(to_request(fence), true);
> > - return !i915_fence_signaled(fence);
> > + return intel_engine_enable_signaling(to_request(fence), true);
> > }
> > @@ -768,11 +769,15 @@ void intel_engine_enable_signaling(struct i915_request *request, bool wakeup)
> > */
> > spin_lock(&b->rb_lock);
> > insert_signal(b, request, seqno);
> > - wakeup &= __intel_engine_add_wait(engine, &request->signaling.wait);
> > + wakeup &= __intel_engine_add_wait(engine, wait);
> > spin_unlock(&b->rb_lock);
> >
> > - if (wakeup)
> > + if (wakeup) {
> > wake_up_process(b->signaler);
> > + return !intel_wait_complete(wait);
>
> ... and would now be based on breadcrumb waiter waking up and removing
> itself from the tree.
And don't forget the same HWS check before the waiter is inserted. So we
have the same guards as before, just inside yet another spinlock.
> So some potential latency where it wasn't before, well, enable-disable
> signalling cycles actually.
The extra steps would be the insert_signal(). Fwiw, we could reorder the
insert_signal() but frankly this, dma_fence enable signaling of an
inflight request, is not a fast path. More commonly we will be enabling
signaling on the request as it is submitted (where wakeup is false and
we know that the HWS cannot be complete).
-Chris
More information about the Intel-gfx
mailing list