drm/i915/gt: Report the currently active execlists request
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 17 Jan 2020 11:32:59 +0000 (11:32 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 17 Jan 2020 16:09:42 +0000 (16:09 +0000)
Since commit 22b7a426bbe1 ("drm/i915/execlists: Preempt-to-busy"), we
prune the engine->active.requests list prior to preemption, thus
removing the trace of the currently executing request. If that request
hangs rather than be preempted, we conclude that no active request was
on the GPU. Fortunately, this only impacts our debugging, and not our
means of hang detection or recovery.

v2: Use from to check the current iterator before continuing, and report
active as NULL if the current request is already completed.

References: 22b7a426bbe1 ("drm/i915/execlists: Preempt-to-busy")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200117113259.3023890-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_engine_cs.c

index 06ff7695fa290b8ad68c4a9a7f2667eb41aed8a5..2d0ef5fc6748a34677a07506330d123f971fff22 100644 (file)
@@ -1657,6 +1657,23 @@ intel_engine_find_active_request(struct intel_engine_cs *engine)
         * we only care about the snapshot of this moment.
         */
        lockdep_assert_held(&engine->active.lock);
+
+       rcu_read_lock();
+       request = execlists_active(&engine->execlists);
+       if (request) {
+               struct intel_timeline *tl = request->context->timeline;
+
+               list_for_each_entry_from_reverse(request, &tl->requests, link) {
+                       if (i915_request_completed(request))
+                               break;
+
+                       active = request;
+               }
+       }
+       rcu_read_unlock();
+       if (active)
+               return active;
+
        list_for_each_entry(request, &engine->active.requests, sched.link) {
                if (i915_request_completed(request))
                        continue;