]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/i915/guc: Advance over port[0] if set and not preempting
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Nov 2017 13:37:44 +0000 (13:37 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Nov 2017 16:08:26 +0000 (16:08 +0000)
Our execlist emulation is intended to only use a maximum of 2 ports per
engine, so as to not overflow the wq. (By knowing the limits, we can
avoid having to handle the wq exhaustion.) However, upon adding
preemption, we lost the skip over the first port if set for the
non-preemption path. Restore it.

Reported-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Fixes: c41937fd994a ("drm/i915/guc: Preemption! With GuC")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Michał Winiarski <michal.winiarski@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171124133745.5173-1-chris@chris-wilson.co.uk
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: Michał Winiarski <michal.winiarski@intel.com>
drivers/gpu/drm/i915/intel_guc_submission.c

index cbf5a96f58068f245e9b530a6a99fb348003e586..70e64bdb73dd2f47b25c6727423fc6ce3ad6e32a 100644 (file)
@@ -743,23 +743,26 @@ static void guc_dequeue(struct intel_engine_cs *engine)
        if (!rb)
                goto unlock;
 
-       if (HAS_LOGICAL_RING_PREEMPTION(engine->i915) && port_isset(port)) {
-               struct guc_preempt_work *preempt_work =
-                       &engine->i915->guc.preempt_work[engine->id];
-
-               if (rb_entry(rb, struct i915_priolist, node)->priority >
-                   max(port_request(port)->priotree.priority, 0)) {
-                       execlists_set_active(execlists,
-                                            EXECLISTS_ACTIVE_PREEMPT);
-                       queue_work(engine->i915->guc.preempt_wq,
-                                  &preempt_work->work);
-                       goto unlock;
-               } else if (port_isset(last_port)) {
-                       goto unlock;
+       if (port_isset(port)) {
+               if (HAS_LOGICAL_RING_PREEMPTION(engine->i915)) {
+                       struct guc_preempt_work *preempt_work =
+                               &engine->i915->guc.preempt_work[engine->id];
+
+                       if (rb_entry(rb, struct i915_priolist, node)->priority >
+                           max(port_request(port)->priotree.priority, 0)) {
+                               execlists_set_active(execlists,
+                                                    EXECLISTS_ACTIVE_PREEMPT);
+                               queue_work(engine->i915->guc.preempt_wq,
+                                          &preempt_work->work);
+                               goto unlock;
+                       }
                }
 
                port++;
+               if (port_isset(port))
+                       goto unlock;
        }
+       GEM_BUG_ON(port_isset(port));
 
        do {
                struct i915_priolist *p = rb_entry(rb, typeof(*p), node);