drm/i915: Check waiter->seqno carefully in case of preemption
If preemption occurs at precisely the right moment, we may decide that the wait is complete even though the wait's request is no longer executing (having been preempted). We handle this situation by double checking that request following deciding whether the wait is complete. Reported-by: Michał Winiarski <michal.winiarski@intel.com> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Michał Winiarski <michal.winiarski@intel.com> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20170918162734.21294-2-chris@chris-wilson.co.uk Reviewed-by: Michał Winiarski <michal.winiarski@intel.com>
This commit is contained in:
parent
17b51ad8e5
commit
de4d2106f8
|
@ -1053,10 +1053,13 @@ static void notify_ring(struct intel_engine_cs *engine)
|
|||
*/
|
||||
if (i915_seqno_passed(intel_engine_get_seqno(engine),
|
||||
wait->seqno)) {
|
||||
struct drm_i915_gem_request *waiter = wait->request;
|
||||
|
||||
wakeup = true;
|
||||
if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
|
||||
&wait->request->fence.flags))
|
||||
rq = i915_gem_request_get(wait->request);
|
||||
&waiter->fence.flags) &&
|
||||
intel_wait_check_request(wait, waiter))
|
||||
rq = i915_gem_request_get(waiter);
|
||||
}
|
||||
|
||||
if (wakeup)
|
||||
|
|
Loading…
Reference in New Issue