Commit db93991b authored by Chris Wilson's avatar Chris Wilson

drm/i915: Only attempt to signal the request once from the interrupt handler

Check that request has not been signaled before acquiring a reference to
the request for signaling later in the interrupt handler.

The loading of the cacheline (for request->fence.flags) should be "free"
when followed by the locked increment of the request->fence.refcount
(which then sets the cacheline to exclusive mode), i.e. the cost of
test_bit prior to an atomic_inc should be negligible. This should
benefit us when we have a pile of bare breadcrumbs (interrupted execbuf)
where we may get interrupts faster than we can get rid of the
intel_wait, or if the device is too slow to run the bottom-half between
interrupts.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170315210726.12095-5-chris@chris-wilson.co.uk
parent 908a6cbf
...@@ -1056,7 +1056,9 @@ static void notify_ring(struct intel_engine_cs *engine) ...@@ -1056,7 +1056,9 @@ static void notify_ring(struct intel_engine_cs *engine)
* and many waiters. * and many waiters.
*/ */
if (i915_seqno_passed(intel_engine_get_seqno(engine), if (i915_seqno_passed(intel_engine_get_seqno(engine),
wait->seqno)) wait->seqno) &&
!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
&wait->request->fence.flags))
rq = i915_gem_request_get(wait->request); rq = i915_gem_request_get(wait->request);
wake_up_process(wait->tsk); wake_up_process(wait->tsk);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment