aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_breadcrumbs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_breadcrumbs.c')
-rw-r--r--drivers/gpu/drm/i915/intel_breadcrumbs.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c b/drivers/gpu/drm/i915/intel_breadcrumbs.c
index cacaa1d04d17..09ed90c0ba00 100644
--- a/drivers/gpu/drm/i915/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c
@@ -106,16 +106,6 @@ bool intel_engine_breadcrumbs_irq(struct intel_engine_cs *engine)
106 106
107 GEM_BUG_ON(!test_bit(I915_FENCE_FLAG_SIGNAL, 107 GEM_BUG_ON(!test_bit(I915_FENCE_FLAG_SIGNAL,
108 &rq->fence.flags)); 108 &rq->fence.flags));
109 clear_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
110
111 /*
112 * We may race with direct invocation of
113 * dma_fence_signal(), e.g. i915_request_retire(),
114 * in which case we can skip processing it ourselves.
115 */
116 if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
117 &rq->fence.flags))
118 continue;
119 109
120 /* 110 /*
121 * Queue for execution after dropping the signaling 111 * Queue for execution after dropping the signaling
@@ -123,6 +113,14 @@ bool intel_engine_breadcrumbs_irq(struct intel_engine_cs *engine)
123 * more signalers to the same context or engine. 113 * more signalers to the same context or engine.
124 */ 114 */
125 i915_request_get(rq); 115 i915_request_get(rq);
116
117 /*
118 * We may race with direct invocation of
119 * dma_fence_signal(), e.g. i915_request_retire(),
120 * so we need to acquire our reference to the request
121 * before we cancel the breadcrumb.
122 */
123 clear_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
126 list_add_tail(&rq->signal_link, &signal); 124 list_add_tail(&rq->signal_link, &signal);
127 } 125 }
128 126