[Intel-gfx] [PATCH 17/57] drm/i915: Extract request suspension from the execlists

Chris Wilson chris at chris-wilson.co.uk
Tue Feb 2 13:26:27 UTC 2021


Quoting Tvrtko Ursulin (2021-02-02 13:15:52)
> 
> On 01/02/2021 08:56, Chris Wilson wrote:
> > +void __i915_sched_resume_request(struct intel_engine_cs *engine,
> > +                              struct i915_request *rq)
> > +{
> > +     LIST_HEAD(list);
> > +
> > +     lockdep_assert_held(&engine->active.lock);
> > +
> > +     if (rq_prio(rq) > engine->execlists.queue_priority_hint) {
> > +             engine->execlists.queue_priority_hint = rq_prio(rq);
> > +             tasklet_hi_schedule(&engine->execlists.tasklet);
> > +     }
> > +
> > +     if (!i915_request_on_hold(rq))
> > +             return;
> > +
> > +     ENGINE_TRACE(engine, "resuming request %llx:%lld\n",
> > +                  rq->fence.context, rq->fence.seqno);
> > +
> > +     /*
> > +      * Move this request back to the priority queue, and all of its
> > +      * children and grandchildren that were suspended along with it.
> > +      */
> > +     do {
> > +             struct i915_dependency *p;
> > +
> > +             RQ_TRACE(rq, "hold release\n");
> > +
> > +             GEM_BUG_ON(!i915_request_on_hold(rq));
> > +             GEM_BUG_ON(!i915_sw_fence_signaled(&rq->submit));
> > +
> > +             i915_request_clear_hold(rq);
> > +             list_del_init(&rq->sched.link);
> > +
> > +             queue_request(engine, rq);
> > +
> > +             /* Also release any children on this engine that are ready */
> > +             for_each_waiter(p, rq) {
> > +                     struct i915_request *w =
> > +                             container_of(p->waiter, typeof(*w), sched);
> > +
> > +                     if (p->flags & I915_DEPENDENCY_WEAK)
> > +                             continue;
> > +
> > +                     /* Propagate any change in error status */
> > +                     if (rq->fence.error)
> > +                             i915_request_set_error_once(w, rq->fence.error);
> > +
> > +                     if (w->engine != engine)
> > +                             continue;
> > +
> > +                     /* We also treat the on-hold status as a visited bit */
> > +                     if (!i915_request_on_hold(w))
> > +                             continue;
> > +
> > +                     /* Check that no other parents are also on hold [BFS] */
> > +                     if (hold_request(w))
> > +                             continue;
> 
> hold_request() appears deleted in the patch so possible rebase error.

The secret is we get to de-duplicate after having duplicated
hold_request() in i915_scheduler in an earlier patch,
  drm/i915: Extract request submission from execlists
-Chris


More information about the Intel-gfx mailing list