]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
drm/i915/guc: Unwind context requests in reverse order
authorMatthew Brost <matthew.brost@intel.com>
Thu, 9 Sep 2021 16:47:24 +0000 (09:47 -0700)
committerAndrea Righi <andrea.righi@canonical.com>
Tue, 7 Dec 2021 06:34:23 +0000 (07:34 +0100)
BugLink: https://bugs.launchpad.net/bugs/1952579
commit c39f51cc980dd918c5b3da61d54c4725785e766e upstream.

When unwinding requests on a reset context, if other requests in the
context are in the priority list the requests could be resubmitted out
of seqno order. Traverse the list of active requests in reverse and
append to the head of the priority list to fix this.

Fixes: eb5e7da736f3 ("drm/i915/guc: Reset implementation for new GuC interface")
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210909164744.31249-4-matthew.brost@intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c

index 6ba1da92876bde8f0d5528735d1ec35f57b1390d..93c9de8f43e8efd7ab28757d619e73454b3270c7 100644 (file)
@@ -807,9 +807,9 @@ __unwind_incomplete_requests(struct intel_context *ce)
 
        spin_lock_irqsave(&sched_engine->lock, flags);
        spin_lock(&ce->guc_active.lock);
-       list_for_each_entry_safe(rq, rn,
-                                &ce->guc_active.requests,
-                                sched.link) {
+       list_for_each_entry_safe_reverse(rq, rn,
+                                        &ce->guc_active.requests,
+                                        sched.link) {
                if (i915_request_completed(rq))
                        continue;
 
@@ -824,7 +824,7 @@ __unwind_incomplete_requests(struct intel_context *ce)
                }
                GEM_BUG_ON(i915_sched_engine_is_empty(sched_engine));
 
-               list_add_tail(&rq->sched.link, pl);
+               list_add(&rq->sched.link, pl);
                set_bit(I915_FENCE_FLAG_PQUEUE, &rq->fence.flags);
        }
        spin_unlock(&ce->guc_active.lock);