diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_breadcrumbs.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_breadcrumbs.c | 18 |
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 | ||