diff options
-rw-r--r-- | drivers/gpu/drm/i915/intel_breadcrumbs.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c b/drivers/gpu/drm/i915/intel_breadcrumbs.c index 438f874a2068..e2dbd919d82f 100644 --- a/drivers/gpu/drm/i915/intel_breadcrumbs.c +++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c | |||
@@ -179,7 +179,7 @@ void __intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine) | |||
179 | void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine) | 179 | void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine) |
180 | { | 180 | { |
181 | struct intel_breadcrumbs *b = &engine->breadcrumbs; | 181 | struct intel_breadcrumbs *b = &engine->breadcrumbs; |
182 | struct intel_wait *wait, *n; | 182 | struct intel_wait *wait, *n, *first; |
183 | 183 | ||
184 | if (!b->irq_armed) | 184 | if (!b->irq_armed) |
185 | return; | 185 | return; |
@@ -190,18 +190,19 @@ void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine) | |||
190 | */ | 190 | */ |
191 | 191 | ||
192 | spin_lock_irq(&b->rb_lock); | 192 | spin_lock_irq(&b->rb_lock); |
193 | |||
194 | spin_lock(&b->irq_lock); | ||
195 | first = fetch_and_zero(&b->irq_wait); | ||
196 | __intel_engine_disarm_breadcrumbs(engine); | ||
197 | spin_unlock(&b->irq_lock); | ||
198 | |||
193 | rbtree_postorder_for_each_entry_safe(wait, n, &b->waiters, node) { | 199 | rbtree_postorder_for_each_entry_safe(wait, n, &b->waiters, node) { |
194 | RB_CLEAR_NODE(&wait->node); | 200 | RB_CLEAR_NODE(&wait->node); |
195 | if (wake_up_process(wait->tsk) && wait == b->irq_wait) | 201 | if (wake_up_process(wait->tsk) && wait == first) |
196 | missed_breadcrumb(engine); | 202 | missed_breadcrumb(engine); |
197 | } | 203 | } |
198 | b->waiters = RB_ROOT; | 204 | b->waiters = RB_ROOT; |
199 | 205 | ||
200 | spin_lock(&b->irq_lock); | ||
201 | b->irq_wait = NULL; | ||
202 | __intel_engine_disarm_breadcrumbs(engine); | ||
203 | spin_unlock(&b->irq_lock); | ||
204 | |||
205 | spin_unlock_irq(&b->rb_lock); | 206 | spin_unlock_irq(&b->rb_lock); |
206 | } | 207 | } |
207 | 208 | ||