Patch "drm/i915/breadcrumbs: Ignore unsubmitted signalers" has been added to the 4.14-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
drm/i915/breadcrumbs: Ignore unsubmitted signalers
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-i915-breadcrumbs-ignore-unsubmitted-signalers.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
117172c8f9d40ba1de8cb35c6e614422faa03330Mon Sep 17 00:00:00 2001
From: Chris Wilson <[email protected]>
Date: Tue, 13 Feb 2018 09:01:54 +0000
Subject: drm/i915/breadcrumbs: Ignore unsubmitted signalers
From: Chris Wilson <[email protected]>
commit 117172c8f9d40ba1de8cb35c6e614422faa03330 upstream.
When a request is preempted, it is unsubmitted from the HW queue and removed from the active list of breadcrumbs. In the process, this however triggers the signaler and it may see the clear rbtree with the old, and still valid, seqno, or it may match the cleared seqno with the now zero rq->global_seqno. This confuses the signaler into action and signaling the fence.
--- drivers/gpu/drm/i915/intel_breadcrumbs.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-)
drivers/gpu/drm/i915/intel_breadcrumbs.c +10 -19
@@ -541,29 +541,16 @@ void intel_engine_remove_wait(struct intspin_unlock_irq (&b->rb_lock); } -static bool signal_valid (const struct drm_i915_gem_request *request) -{ -return intel_wait_check_request (&request->signaling.wait, request); -} -static bool signal_complete (const struct drm_i915_gem_request *request) {if (!request)return false; -/* If another process served as the bottom-half it may have already -* signalled that this wait is already completed. -*/ -if (intel_wait_complete (&request->signaling.wait)) -return signal_valid (request); - -/* Carefully check if the request is complete, giving time for the +/* +* Carefully check if the request is complete, giving time for the * seqno to be visible or if the GPU hung. */ -if (__i915_request_irq_complete (request)) -return true; - -return false; +return __i915_request_irq_complete (request); }static struct drm_i915_gem_request *to_signaler (struct rb_node *rb)
@@ -606,9 +593,13 @@ static int intel_breadcrumbs_signaler(vo request =i915_gem_request_get_rcu (request);rcu_read_unlock ();if (signal_complete (request)) { -local_bh_disable (); -dma_fence_signal (&request->fence); -local_bh_enable ();/* kick start the tasklets */ +if (!test_bit (DMA_FENCE_FLAG_SIGNALED_BIT , + &request->fence.flags)) { +local_bh_disable (); +dma_fence_signal (&request->fence); +GEM_BUG_ON (!i915_gem_request_completed (request)); +local_bh_enable ();/* kick start the tasklets */ + }spin_lock_irq (&b->rb_lock);
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/drm-handle-unexpected-holes-in-color-eviction.patch queue-4.14/drm-i915-breadcrumbs-ignore-unsubmitted-signalers.patch