diff options
| author | Chris Wilson <chris@chris-wilson.co.uk> | 2018-06-27 16:13:04 -0400 |
|---|---|---|
| committer | Chris Wilson <chris@chris-wilson.co.uk> | 2018-06-28 15:56:35 -0400 |
| commit | e3be4079ea91c8b7bcb97cf44889ec5663c55fb4 (patch) | |
| tree | 2d3a704eda86bec44d06f9f7ee0179e4dc5740d4 /drivers/gpu/drm | |
| parent | 78796877c37cb2c3898c4bcd2a12238d83858287 (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.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_request.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 5 |
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 | ||
| 1290 | restart: | 1290 | restart: |
| 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 */ |
| 929 | int intel_engine_init_breadcrumbs(struct intel_engine_cs *engine); | 929 | int intel_engine_init_breadcrumbs(struct intel_engine_cs *engine); |
| 930 | 930 | ||
| 931 | static inline void intel_wait_init(struct intel_wait *wait, | 931 | static 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 | ||
| 938 | static inline void intel_wait_init_for_seqno(struct intel_wait *wait, u32 seqno) | 937 | static inline void intel_wait_init_for_seqno(struct intel_wait *wait, u32 seqno) |
