drm/i915: Fix eviction when the GGTT is idle but full
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 12 Oct 2017 12:57:24 +0000 (13:57 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 12 Oct 2017 20:06:26 +0000 (21:06 +0100)
commit55b4f1ce2f23692c57205b9974fba61baa4b9321
treec78bffe1033e2d22aa3b45b63b1c538f5c8a9aba
parent4d90f2d507ab4634e9e1923de3a6769ac0aa71fa
drm/i915: Fix eviction when the GGTT is idle but full

In the full-ppgtt world, we can fill the GGTT full of context objects.
These context objects are currently implicitly tracked by the requests
that pin them i.e. they are only unpinned when the request is completed
and retired, but we do not have the link from the vma to the request
(anymore). In order to unpin those contexts, we have to issue another
request and wait upon the switch to the kernel context.

The bug during eviction was that we assumed that a full GGTT meant we
would have requests on the GGTT timeline, and so we missed situations
where those requests where merely in flight (and when even they have not
yet been submitted to hw yet). The fix employed here is to change the
already-is-idle test to no look at the execution timeline, but count the
outstanding requests and then check that we have switched to the kernel
context. Erring on the side of overkill here just means that we stall a
little longer than may be strictly required, but we only expect to hit
this path in extreme corner cases where returning an erroneous error is
worse than the delay.

v2: Logical inversion when swapping over branches.

Fixes: 80b204bce8f2 ("drm/i915: Enable multiple timelines")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171012125726.14736-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem_evict.c