Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de4d2106 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Check waiter->seqno carefully in case of preemption



If preemption occurs at precisely the right moment, we may decide that
the wait is complete even though the wait's request is no longer
executing (having been preempted). We handle this situation by double
checking that request following deciding whether the wait is complete.

Reported-by: default avatarMichał Winiarski <michal.winiarski@intel.com>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Michał Winiarski <michal.winiarski@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20170918162734.21294-2-chris@chris-wilson.co.uk


Reviewed-by: default avatarMichał Winiarski <michal.winiarski@intel.com>
parent 17b51ad8
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -1053,10 +1053,13 @@ static void notify_ring(struct intel_engine_cs *engine)
		 */
		if (i915_seqno_passed(intel_engine_get_seqno(engine),
				      wait->seqno)) {
			struct drm_i915_gem_request *waiter = wait->request;

			wakeup = true;
			if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
				      &wait->request->fence.flags))
				rq = i915_gem_request_get(wait->request);
				      &waiter->fence.flags) &&
			    intel_wait_check_request(wait, waiter))
				rq = i915_gem_request_get(waiter);
		}

		if (wakeup)