drm/i915: Mark up "sentinel" requests
authorChris Wilson <chris@chris-wilson.co.uk>
Sat, 12 Oct 2019 07:01:36 +0000 (08:01 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Sat, 12 Oct 2019 07:51:17 +0000 (08:51 +0100)
Sometimes we want to emit a terminator request, a request that flushes
the pipeline and allows no request to come after it. This can be used
for a "preempt-to-idle" to ensure that upon processing the
context-switch to that request, all other active contexts have been
flushed.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191012070136.32058-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_lrc.c
drivers/gpu/drm/i915/i915_request.h

index 7f2d28bf9ea33d1ba8dd90e7baf7c87458da5696..a07baeb897fef6a71792c4c89adb9bd3853040d2 100644 (file)
@@ -1208,7 +1208,8 @@ static bool can_merge_rq(const struct i915_request *prev,
        if (i915_request_completed(next))
                return true;
 
-       if (unlikely(prev->flags ^ next->flags) & I915_REQUEST_NOPREEMPT)
+       if (unlikely((prev->flags ^ next->flags) &
+                    (I915_REQUEST_NOPREEMPT | I915_REQUEST_SENTINEL)))
                return false;
 
        if (!can_merge_ctx(prev->hw_context, next->hw_context))
@@ -1659,6 +1660,9 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
                                if (last->hw_context == rq->hw_context)
                                        goto done;
 
+                               if (i915_request_has_sentinel(last))
+                                       goto done;
+
                                /*
                                 * If GVT overrides us we only ever submit
                                 * port[0], leaving port[1] empty. Note that we
index 6a95242b280dccc9e837afcb590a71f70fbd2d8d..96991d64759cfe5d239ffe1bfc6dc1cdd3b3c992 100644 (file)
@@ -216,8 +216,9 @@ struct i915_request {
        unsigned long emitted_jiffies;
 
        unsigned long flags;
-#define I915_REQUEST_WAITBOOST BIT(0)
-#define I915_REQUEST_NOPREEMPT BIT(1)
+#define I915_REQUEST_WAITBOOST BIT(0)
+#define I915_REQUEST_NOPREEMPT BIT(1)
+#define I915_REQUEST_SENTINEL  BIT(2)
 
        /** timeline->request entry for this request */
        struct list_head link;
@@ -440,6 +441,11 @@ static inline bool i915_request_has_nopreempt(const struct i915_request *rq)
        return unlikely(rq->flags & I915_REQUEST_NOPREEMPT);
 }
 
+static inline bool i915_request_has_sentinel(const struct i915_request *rq)
+{
+       return unlikely(rq->flags & I915_REQUEST_SENTINEL);
+}
+
 static inline struct intel_timeline *
 i915_request_timeline(struct i915_request *rq)
 {