drm/i915/execlists: Wrap tail pointer after reset tweaking
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 27 Mar 2017 13:00:07 +0000 (14:00 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 27 Mar 2017 14:02:56 +0000 (15:02 +0100)
commit450362d3fe866b14304f309b5fffba0c33fbfbc3
treec53e201e5df3e0382777dad59052deb7d9de1d06
parentf9407ae1533111cd43161734582932b13397ab7e
drm/i915/execlists: Wrap tail pointer after reset tweaking

If the request->wa_tail is 0 (because it landed exactly on the end of
the ringbuffer), when we reconstruct request->tail following a reset we
fill in an illegal value (-8 or 0x001ffff8). As a result, RING_HEAD is
never able to catch up with RING_TAIL and the GPU spins endlessly. If
the ring contains a couple of breadcrumbs, even our hangcheck is unable
to catch the busy-looping as the ACTHD and seqno continually advance.

v2: Move the wrap into a common intel_ring_wrap().

Fixes: a3aabe86a340 ("drm/i915/execlists: Reinitialise context image after GPU hang")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Cc: <stable@vger.kernel.org> # v4.10+
Link: http://patchwork.freedesktop.org/patch/msgid/20170327130009.4678-1-chris@chris-wilson.co.uk
Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com>
drivers/gpu/drm/i915/intel_lrc.c
drivers/gpu/drm/i915/intel_ringbuffer.h