Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> writes: > Now that we have a common engine state pretty printer, we can use that > instead of the adhoc information printed when we miss a breadcrumb. > > v2: Rearrange intel_engine_disarm_breadcrumbs() to avoid calling > intel_engine_dump() under the rb spinlock (Mika) and to pretty-print the > error state early so that we include the full list of waiters. > v3: Pass missed breadcrumb msg to pretty-printer as the header > v4: Preserve DRM_DEBUG_DRIVER filtering. > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: Mika Kuoppala <mika.kuoppala@xxxxxxxxx> > Cc: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> Reviewed-by: Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/intel_breadcrumbs.c | 25 ++++++++++++++----------- > drivers/gpu/drm/i915/intel_engine_cs.c | 6 ++++++ > 2 files changed, 20 insertions(+), 11 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c b/drivers/gpu/drm/i915/intel_breadcrumbs.c > index 5ae2d276f7f3..24c6fefdd0b1 100644 > --- a/drivers/gpu/drm/i915/intel_breadcrumbs.c > +++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c > @@ -64,12 +64,13 @@ static unsigned long wait_timeout(void) > > static noinline void missed_breadcrumb(struct intel_engine_cs *engine) > { > - DRM_DEBUG_DRIVER("%s missed breadcrumb at %pS, irq posted? %s, current seqno=%x, last=%x\n", > - engine->name, __builtin_return_address(0), > - yesno(test_bit(ENGINE_IRQ_BREADCRUMB, > - &engine->irq_posted)), > - intel_engine_get_seqno(engine), > - intel_engine_last_submit(engine)); > + if (drm_debug & DRM_UT_DRIVER) { > + struct drm_printer p = drm_debug_printer(__func__); > + > + intel_engine_dump(engine, &p, > + "%s missed breadcrumb at %pS\n", > + engine->name, __builtin_return_address(0)); > + } > > set_bit(engine->id, &engine->i915->gpu_error.missed_irq_rings); > } > @@ -213,28 +214,30 @@ void intel_engine_unpin_breadcrumbs_irq(struct intel_engine_cs *engine) > void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine) > { > struct intel_breadcrumbs *b = &engine->breadcrumbs; > - struct intel_wait *wait, *n, *first; > + struct intel_wait *wait, *n; > > if (!b->irq_armed) > return; > > - /* We only disarm the irq when we are idle (all requests completed), > + /* > + * We only disarm the irq when we are idle (all requests completed), > * so if the bottom-half remains asleep, it missed the request > * completion. > */ > + if (intel_engine_wakeup(engine) & ENGINE_WAKEUP_ASLEEP) > + missed_breadcrumb(engine); > > spin_lock_irq(&b->rb_lock); > > spin_lock(&b->irq_lock); > - first = fetch_and_zero(&b->irq_wait); > + b->irq_wait = NULL; > if (b->irq_armed) > __intel_engine_disarm_breadcrumbs(engine); > spin_unlock(&b->irq_lock); > > rbtree_postorder_for_each_entry_safe(wait, n, &b->waiters, node) { > RB_CLEAR_NODE(&wait->node); > - if (wake_up_process(wait->tsk) && wait == first) > - missed_breadcrumb(engine); > + wake_up_process(wait->tsk); > } > b->waiters = RB_ROOT; > > diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c > index e9d5cd28291f..aa490120749a 100644 > --- a/drivers/gpu/drm/i915/intel_engine_cs.c > +++ b/drivers/gpu/drm/i915/intel_engine_cs.c > @@ -1822,6 +1822,12 @@ void intel_engine_dump(struct intel_engine_cs *engine, > } > spin_unlock_irq(&b->rb_lock); > > + drm_printf(m, "IRQ? 0x%lx (breadcrumbs? %s) (execlists? %s)\n", > + engine->irq_posted, > + yesno(test_bit(ENGINE_IRQ_BREADCRUMB, > + &engine->irq_posted)), > + yesno(test_bit(ENGINE_IRQ_EXECLIST, > + &engine->irq_posted))); > drm_printf(m, "Idle? %s\n", yesno(intel_engine_is_idle(engine))); > drm_printf(m, "\n"); > } > -- > 2.15.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx