Commit 15db5fcc authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915/execlists: Check the sentinel is alone in the ELSP



We only use sentinel requests for "preempt-to-idle" passes, so assert
that they are the only request in a new submission.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200302085812.4172450-12-chris@chris-wilson.co.uk
parent 4b4e973d
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -1448,6 +1448,7 @@ assert_pending_valid(const struct intel_engine_execlists *execlists,
{
	struct i915_request * const *port, *rq;
	struct intel_context *ce = NULL;
	bool sentinel = false;

	trace_ports(execlists, msg, execlists->pending);

@@ -1481,6 +1482,26 @@ assert_pending_valid(const struct intel_engine_execlists *execlists,
		}
		ce = rq->context;

		/*
		 * Sentinels are supposed to be lonely so they flush the
		 * current exection off the HW. Check that they are the
		 * only request in the pending submission.
		 */
		if (sentinel) {
			GEM_TRACE_ERR("context:%llx after sentinel in pending[%zd]\n",
				      ce->timeline->fence_context,
				      port - execlists->pending);
			return false;
		}

		sentinel = i915_request_has_sentinel(rq);
		if (sentinel && port != execlists->pending) {
			GEM_TRACE_ERR("sentinel context:%llx not in prime position[%zd]\n",
				      ce->timeline->fence_context,
				      port - execlists->pending);
			return false;
		}

		/* Hold tightly onto the lock to prevent concurrent retires! */
		if (!spin_trylock_irqsave(&rq->lock, flags))
			continue;