aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-06-27 16:13:04 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2018-06-28 15:56:35 -0400
commite3be4079ea91c8b7bcb97cf44889ec5663c55fb4 (patch)
tree2d3a704eda86bec44d06f9f7ee0179e4dc5740d4 /drivers/gpu/drm
parent78796877c37cb2c3898c4bcd2a12238d83858287 (diff)
drm/i915: Only signal from interrupt when requested
Avoid calling dma_fence_signal() from inside the interrupt if we haven't enabled signaling on the request. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180627201304.15817-4-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c8
-rw-r--r--drivers/gpu/drm/i915/i915_request.c2
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h5
3 files changed, 9 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index c81b4c1877cc..4be56aec99b3 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1182,7 +1182,8 @@ static void notify_ring(struct intel_engine_cs *engine)
1182 if (i915_seqno_passed(seqno, wait->seqno)) { 1182 if (i915_seqno_passed(seqno, wait->seqno)) {
1183 struct i915_request *waiter = wait->request; 1183 struct i915_request *waiter = wait->request;
1184 1184
1185 if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, 1185 if (waiter &&
1186 !test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
1186 &waiter->fence.flags) && 1187 &waiter->fence.flags) &&
1187 intel_wait_check_request(wait, waiter)) 1188 intel_wait_check_request(wait, waiter))
1188 rq = i915_request_get(waiter); 1189 rq = i915_request_get(waiter);
@@ -1205,8 +1206,11 @@ static void notify_ring(struct intel_engine_cs *engine)
1205 spin_unlock(&engine->breadcrumbs.irq_lock); 1206 spin_unlock(&engine->breadcrumbs.irq_lock);
1206 1207
1207 if (rq) { 1208 if (rq) {
1208 dma_fence_signal(&rq->fence); 1209 spin_lock(&rq->lock);
1210 dma_fence_signal_locked(&rq->fence);
1209 GEM_BUG_ON(!i915_request_completed(rq)); 1211 GEM_BUG_ON(!i915_request_completed(rq));
1212 spin_unlock(&rq->lock);
1213
1210 i915_request_put(rq); 1214 i915_request_put(rq);
1211 } 1215 }
1212 1216
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index 39b296878ba2..a2f7e9358450 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -1285,7 +1285,7 @@ long i915_request_wait(struct i915_request *rq,
1285 if (flags & I915_WAIT_LOCKED) 1285 if (flags & I915_WAIT_LOCKED)
1286 add_wait_queue(errq, &reset); 1286 add_wait_queue(errq, &reset);
1287 1287
1288 intel_wait_init(&wait, rq); 1288 intel_wait_init(&wait);
1289 1289
1290restart: 1290restart:
1291 do { 1291 do {
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 44ac90ec540c..78f01a35823a 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -928,11 +928,10 @@ static inline u32 intel_hws_preempt_done_address(struct intel_engine_cs *engine)
928/* intel_breadcrumbs.c -- user interrupt bottom-half for waiters */ 928/* intel_breadcrumbs.c -- user interrupt bottom-half for waiters */
929int intel_engine_init_breadcrumbs(struct intel_engine_cs *engine); 929int intel_engine_init_breadcrumbs(struct intel_engine_cs *engine);
930 930
931static inline void intel_wait_init(struct intel_wait *wait, 931static inline void intel_wait_init(struct intel_wait *wait)
932 struct i915_request *rq)
933{ 932{
934 wait->tsk = current; 933 wait->tsk = current;
935 wait->request = rq; 934 wait->request = NULL;
936} 935}
937 936
938static inline void intel_wait_init_for_seqno(struct intel_wait *wait, u32 seqno) 937static inline void intel_wait_init_for_seqno(struct intel_wait *wait, u32 seqno)