drm/i915/execlists: Always clear preempt status on cancelling all
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 16 Jul 2018 12:54:24 +0000 (13:54 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 16 Jul 2018 16:17:27 +0000 (17:17 +0100)
On reset/wedging, we cancel all pending replies from the HW and we also
want to cancel an outstanding preemption event. Since we use the same
function to cancel the pending replies for reset and for a preemption
event, we can simply clear the active tracking for all.

v2: Keep execlists_user_end() markup for wedging
v3: Move assignment to inline to hide the bare assignment.

Fixes: 60a943245413 ("drm/i915/execlists: Drop clear_gtiir() on GPU reset")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180716125424.5715-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/intel_guc_submission.c
drivers/gpu/drm/i915/intel_lrc.c
drivers/gpu/drm/i915/intel_ringbuffer.h

index cc444dc5f3adbc36efbb237247f9e4d14037b8ff..94d0674ea3c6a85bc02252471896191c5a7dbe7d 100644 (file)
@@ -633,8 +633,6 @@ static void complete_preempt_context(struct intel_engine_cs *engine)
 
        wait_for_guc_preempt_report(engine);
        intel_write_status_page(engine, I915_GEM_HWS_PREEMPT_INDEX, 0);
-
-       execlists_clear_active(execlists, EXECLISTS_ACTIVE_PREEMPT);
 }
 
 /**
index 629127e03577030d6d0cf6699a29266734ad92fa..c0ee14f8675494a545a41a6a961d587466812a65 100644 (file)
@@ -563,8 +563,6 @@ static void complete_preempt_context(struct intel_engine_execlists *execlists)
        __unwind_incomplete_requests(container_of(execlists,
                                                  struct intel_engine_cs,
                                                  execlists));
-
-       execlists_clear_active(execlists, EXECLISTS_ACTIVE_PREEMPT);
 }
 
 static void execlists_dequeue(struct intel_engine_cs *engine)
@@ -792,8 +790,7 @@ execlists_cancel_port_requests(struct intel_engine_execlists * const execlists)
                port++;
        }
 
-       execlists_clear_active(execlists, EXECLISTS_ACTIVE_USER);
-       execlists_user_end(execlists);
+       execlists_clear_all_active(execlists);
 }
 
 static void reset_csb_pointers(struct intel_engine_execlists *execlists)
@@ -844,6 +841,7 @@ static void execlists_cancel_requests(struct intel_engine_cs *engine)
 
        /* Cancel the requests on the HW and clear the ELSP tracker. */
        execlists_cancel_port_requests(execlists);
+       execlists_user_end(execlists);
 
        /* Mark all executing requests as skipped. */
        list_for_each_entry(rq, &engine->timeline.requests, link) {
index d1eee08e5f6bb9d1334a48ad7c36d07990fea149..665b59ba1f45d9b6c96edb557261481a7de1e02b 100644 (file)
@@ -683,6 +683,12 @@ execlists_clear_active(struct intel_engine_execlists *execlists,
        __clear_bit(bit, (unsigned long *)&execlists->active);
 }
 
+static inline void
+execlists_clear_all_active(struct intel_engine_execlists *execlists)
+{
+       execlists->active = 0;
+}
+
 static inline bool
 execlists_is_active(const struct intel_engine_execlists *execlists,
                    unsigned int bit)