aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/intel_breadcrumbs.c15
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)
179void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine) 179void 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