From: Greg Kroah-Hartman Date: Mon, 26 Feb 2018 19:57:28 +0000 (+0100) Subject: 4.14-stable patches X-Git-Tag: v3.18.97~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6da88807b4bd0274d9ba09977013cd958ba346a1;p=thirdparty%2Fkernel%2Fstable-queue.git 4.14-stable patches added patches: drm-i915-breadcrumbs-ignore-unsubmitted-signalers.patch --- diff --git a/queue-4.14/drm-i915-breadcrumbs-ignore-unsubmitted-signalers.patch b/queue-4.14/drm-i915-breadcrumbs-ignore-unsubmitted-signalers.patch new file mode 100644 index 00000000000..af3b3ac9b14 --- /dev/null +++ b/queue-4.14/drm-i915-breadcrumbs-ignore-unsubmitted-signalers.patch @@ -0,0 +1,84 @@ +From 117172c8f9d40ba1de8cb35c6e614422faa03330 Mon Sep 17 00:00:00 2001 +From: Chris Wilson +Date: Tue, 13 Feb 2018 09:01:54 +0000 +Subject: drm/i915/breadcrumbs: Ignore unsubmitted signalers + +From: Chris Wilson + +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. + +Fixes: d6a2289d9d6b ("drm/i915: Remove the preempted request from the execution queue") +Signed-off-by: Chris Wilson +Cc: Tvrtko Ursulin +Cc: Joonas Lahtinen +Cc: # v4.12+ +Reviewed-by: Tvrtko Ursulin +Link: https://patchwork.freedesktop.org/patch/msgid/20180206094633.30181-1-chris@chris-wilson.co.uk +(cherry picked from commit fd10e2ce9905030d922e179a8047a4d50daffd8e) +Signed-off-by: Rodrigo Vivi +Link: https://patchwork.freedesktop.org/patch/msgid/20180213090154.17373-1-chris@chris-wilson.co.uk +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_breadcrumbs.c | 29 ++++++++++------------------- + 1 file changed, 10 insertions(+), 19 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_breadcrumbs.c ++++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c +@@ -541,29 +541,16 @@ void intel_engine_remove_wait(struct int + spin_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); + diff --git a/queue-4.14/series b/queue-4.14/series index 280ec4f75a4..cdda46365e5 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -51,3 +51,4 @@ drm-amdgpu-only-check-mmbif_iov_func_identifier-on-tonga-fiji.patch drm-amdgpu-add-atpx-quirk-handling-v2.patch drm-amdgpu-avoid-leaking-pm-domain-on-driver-unbind-v2.patch drm-amdgpu-add-new-device-to-use-atpx-quirk.patch +drm-i915-breadcrumbs-ignore-unsubmitted-signalers.patch