drm/i915: Fixup preempt-to-busy vs reset of a virtual request
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 23 Sep 2019 15:28:43 +0000 (16:28 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 23 Sep 2019 19:44:14 +0000 (20:44 +0100)
commitcb2377a919bbe8107af269c5a31a8d5cfb27d867
tree978111bc13d7642f08d151d347c8dd69008d3fe4
parentb647c7df01b75761b4c0b1cb6f4841088c0b1121
drm/i915: Fixup preempt-to-busy vs reset of a virtual request

Due to the nature of preempt-to-busy the execlists active tracking and
the schedule queue may become temporarily desync'ed (between resubmission
to HW and its ack from HW). This means that we may have unwound a
request and passed it back to the virtual engine, but it is still
inflight on the HW and may even result in a GPU hang. If we detect that
GPU hang and try to reset, the hanging request->engine will no longer
match the current engine, which means that the request is not on the
execlists active list and we should not try to find an older incomplete
request. Given that we have deduced this must be a request on a virtual
engine, it is the single active request in the context and so must be
guilty (as the context is still inflight, it is prevented from being
executed on another engine as we process the reset).

Fixes: 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>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190923152844.8914-2-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_lrc.c
drivers/gpu/drm/i915/gt/intel_reset.c