Commit bc61ec46 authored by Chris Wilson's avatar Chris Wilson Committed by Jani Nikula

drm/i915: Remove stale asserts from i915_gem_find_active_request()

Since we use i915_gem_find_active_request() from inside
intel_engine_dump() and may call that at any time, we do not guarantee
that the engine is paused nor that the signal kthreads and irq handler
are suspended, so we cannot assert that the breadcrumb doesn't advance
and that the irq hasn't happened on another CPU signaling the request we
believe to be idle.

The second assert removed (that request->engine == engine) remains
valid, but is now more rigorously checked during retirement.

Fixes: f636edb2 ("drm/i915: Make i915_engine_info pretty printer to standalone")
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180529132922.6831-1-chris@chris-wilson.co.ukReviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
(cherry picked from commit cc7cc534)
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 368b554d
...@@ -2972,23 +2972,22 @@ i915_gem_find_active_request(struct intel_engine_cs *engine) ...@@ -2972,23 +2972,22 @@ i915_gem_find_active_request(struct intel_engine_cs *engine)
struct i915_request *request, *active = NULL; struct i915_request *request, *active = NULL;
unsigned long flags; unsigned long flags;
/* We are called by the error capture and reset at a random /*
* point in time. In particular, note that neither is crucially * We are called by the error capture, reset and to dump engine
* ordered with an interrupt. After a hang, the GPU is dead and we * state at random points in time. In particular, note that neither is
* assume that no more writes can happen (we waited long enough for * crucially ordered with an interrupt. After a hang, the GPU is dead
* all writes that were in transaction to be flushed) - adding an * and we assume that no more writes can happen (we waited long enough
* for all writes that were in transaction to be flushed) - adding an
* extra delay for a recent interrupt is pointless. Hence, we do * extra delay for a recent interrupt is pointless. Hence, we do
* not need an engine->irq_seqno_barrier() before the seqno reads. * not need an engine->irq_seqno_barrier() before the seqno reads.
* At all other times, we must assume the GPU is still running, but
* we only care about the snapshot of this moment.
*/ */
spin_lock_irqsave(&engine->timeline.lock, flags); spin_lock_irqsave(&engine->timeline.lock, flags);
list_for_each_entry(request, &engine->timeline.requests, link) { list_for_each_entry(request, &engine->timeline.requests, link) {
if (__i915_request_completed(request, request->global_seqno)) if (__i915_request_completed(request, request->global_seqno))
continue; continue;
GEM_BUG_ON(request->engine != engine);
GEM_BUG_ON(test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
&request->fence.flags));
active = request; active = request;
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment