On Wed, Feb 22, 2017 at 04:53:35PM +0000, Tvrtko Ursulin wrote: > > On 17/02/2017 15:51, Chris Wilson wrote: > > if (engine->irq_seqno_barrier && > >- rcu_access_pointer(engine->breadcrumbs.irq_seqno_bh) == current && > > test_and_clear_bit(ENGINE_IRQ_BREADCRUMB, &engine->irq_posted)) { > >- struct task_struct *tsk; > >+ unsigned long flags; > > > > /* The ordering of irq_posted versus applying the barrier > > * is crucial. The clearing of the current irq_posted must > >@@ -4058,17 +4061,17 @@ __i915_request_irq_complete(const struct drm_i915_gem_request *req) > > * the seqno before we believe it coherent since they see > > * irq_posted == false but we are still running). > > */ > >- rcu_read_lock(); > >- tsk = rcu_dereference(engine->breadcrumbs.irq_seqno_bh); > >- if (tsk && tsk != current) > >+ spin_lock_irqsave(&engine->breadcrumbs.lock, flags); > >+ if (engine->breadcrumbs.first_wait && > >+ engine->breadcrumbs.first_wait->tsk != current) > > /* Note that if the bottom-half is changed as we > > * are sending the wake-up, the new bottom-half will > > * be woken by whomever made the change. We only have > > * to worry about when we steal the irq-posted for > > * ourself. > > */ > >- wake_up_process(tsk); > >- rcu_read_unlock(); > >+ wake_up_process(engine->breadcrumbs.first_wait->tsk); > >+ spin_unlock_irqrestore(&engine->breadcrumbs.lock, flags); > > Worth caching &engine->breadcrumbs maybe? Makes no difference to object code, but makes it more pleasant to read, so yes. -Chris -- Chris Wilson, Intel Open Source Technology Centre _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx