[Intel-gfx] [PATCH 12/37] drm/i915: Priority boost for new clients

Chris Wilson chris at chris-wilson.co.uk
Fri Jun 29 10:51:01 UTC 2018


Quoting Tvrtko Ursulin (2018-06-29 11:36:50)
> 
> On 29/06/2018 11:09, Chris Wilson wrote:
> > Quoting Tvrtko Ursulin (2018-06-29 11:04:36)
> >>
> >> On 29/06/2018 08:53, Chris Wilson wrote:
> >>> Taken from an idea used for FQ_CODEL, we give new request flows a
> >>> priority boost. These flows are likely to correspond with interactive
> >>> tasks and so be more latency sensitive than the long queues. As soon as
> >>> the client has more than one request in the queue, further requests are
> >>> not boosted and it settles down into ordinary steady state behaviour.
> >>> Such small kicks dramatically help combat the starvation issue, by
> >>> allowing each client the opportunity to run even when the system is
> >>> under heavy throughput load (within the constraints of the user
> >>> selected priority).
> >>
> >> Any effect on non-micro benchmarks to mention in the commit message as
> >> the selling point?
> > 
> > Desktop interactivity, subjective.
> > wsim showed a major impact
> >   
> >>> Testcase: igt/benchmarks/rrul
> >>> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> >>> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> >>> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> >>> ---
> >>>    drivers/gpu/drm/i915/i915_request.c   | 16 ++++++++++++++--
> >>>    drivers/gpu/drm/i915/i915_scheduler.h |  4 +++-
> >>>    2 files changed, 17 insertions(+), 3 deletions(-)
> >>>
> >>> diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
> >>> index 14bf0be6f994..2d7a785dd88c 100644
> >>> --- a/drivers/gpu/drm/i915/i915_request.c
> >>> +++ b/drivers/gpu/drm/i915/i915_request.c
> >>> @@ -1052,8 +1052,20 @@ void i915_request_add(struct i915_request *request)
> >>>         */
> >>>        local_bh_disable();
> >>>        rcu_read_lock(); /* RCU serialisation for set-wedged protection */
> >>> -     if (engine->schedule)
> >>> -             engine->schedule(request, &request->gem_context->sched);
> >>> +     if (engine->schedule) {
> >>> +             struct i915_sched_attr attr = request->gem_context->sched;
> >>> +
> >>> +             /*
> >>> +              * Boost priorities to new clients (new request flows).
> >>> +              *
> >>> +              * Allow interactive/synchronous clients to jump ahead of
> >>> +              * the bulk clients. (FQ_CODEL)
> >>> +              */
> >>> +             if (!prev || i915_request_completed(prev))
> >>> +                     attr.priority |= I915_PRIORITY_NEWCLIENT;
> >>
> >> Now a "lucky" client can always get higher priority an keep preempting
> >> everyone else by just timing it's submissions right. So I have big
> >> reservations on this one.
> > 
> > Lucky being someone who is _idle_, everyone else being steady state. You
> > can't keep getting lucky and stealing the show.
> 
> Why couldn't it? All it is needed is to send a new execbuf after the 
> previous has completed.
> 
> 1. First ctx A eb -> priority boost
> 2. Other people get back in and start executing
> 3. Another ctx A eb -> first has completed -> another priority boost -> 
> work from 2) is preempted
> 4. Goto 2.

So you have one client spinning, it's going to win most races and starve
the system, simply by owning struct_mutex. We give the other starving
steady-state clients an opportunity to submit ahead of the spinner when
they come to resubmit.
-Chris


More information about the Intel-gfx mailing list