[Intel-gfx] [PATCH] drm/i915: Cancel pending execlist tasklet upon wedging

Chris Wilson chris at chris-wilson.co.uk
Wed Jun 21 13:56:00 UTC 2017


Quoting Tvrtko Ursulin (2017-06-21 14:33:59)
> 
> On 21/06/2017 13:48, Chris Wilson wrote:
> > Highly unlikely, but if the stop_machine() did suspend the tasklet, we
> > want to make sure that when it wakes it finds there is nothing to do.
> > Otherwise, it will loudly complain that the ELSP port tracking no longer
> > matches the hardware, and we will be mightly confused.
> > 
> > Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> > Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> > ---
> >   drivers/gpu/drm/i915/i915_gem.c | 7 +++++++
> >   1 file changed, 7 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> > index 1353491c1010..ae3ce1314bd1 100644
> > --- a/drivers/gpu/drm/i915/i915_gem.c
> > +++ b/drivers/gpu/drm/i915/i915_gem.c
> > @@ -3092,6 +3092,13 @@ static void engine_set_wedged(struct intel_engine_cs *engine)
> >               engine->execlist_first = NULL;
> >   
> >               spin_unlock_irqrestore(&engine->timeline->lock, flags);
> > +
> > +             /* The port is checked prior to scheduling a tasklet, but
> > +              * just in case we have suspended the tasklet to do the
> > +              * wedging make sure that when it wakes, it decides there
> > +              * is no work to do by clearing the irq_posted bit.
> > +              */
> > +             clear_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted);
> >       }
> >   }
> >   
> > 
> 
> Or tasklet_kill?

Hmm, technically not permitted:

void tasklet_kill(struct tasklet_struct *t)
{
        if (in_interrupt())
                pr_notice("Attempt to kill tasklet from interrupt\n");

        while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
                do {
                        yield();
                } while (test_bit(TASKLET_STATE_SCHED, &t->state));
        }
        tasklet_unlock_wait(t);
        clear_bit(TASKLET_STATE_SCHED, &t->state);
}

Even if we don't trigger the in_interrupt() simply due to having
interrupts disabled, then the potential yield() is illegal from inside
stop_machine().
-Chris


More information about the Intel-gfx mailing list