On Thu, May 18, 2017 at 03:59:43PM +0200, Michał Winiarski wrote: > We'd like to reuse the priolist lookup in request resubmission path, > let's split insert_request to make that happen. > > Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> > Cc: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> > Signed-off-by: Michał Winiarski <michal.winiarski@xxxxxxxxx> > --- > drivers/gpu/drm/i915/intel_lrc.c | 65 ++++++++++++++++++++++++---------------- > 1 file changed, 39 insertions(+), 26 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c > index 1255724..c43ca1b 100644 > --- a/drivers/gpu/drm/i915/intel_lrc.c > +++ b/drivers/gpu/drm/i915/intel_lrc.c > @@ -627,20 +627,15 @@ static void intel_lrc_irq_handler(unsigned long data) > intel_uncore_forcewake_put(dev_priv, engine->fw_domains); > } > > -static bool > -insert_request(struct intel_engine_cs *engine, > - struct i915_priotree *pt, > - int prio) > +static struct i915_priolist * > +priolist_lookup(struct intel_engine_cs *engine, int prio, bool *first) > { > struct i915_priolist *p; > struct rb_node **parent, *rb; > - bool first = true; > > if (unlikely(engine->no_priolist)) > prio = I915_PRIORITY_NORMAL; > - > -find_priolist: > - /* most positive priority is scheduled first, equal priorities fifo */ > + *first = true; > rb = NULL; > parent = &engine->execlist_queue.rb_node; > while (*parent) { > @@ -650,10 +645,10 @@ insert_request(struct intel_engine_cs *engine, > parent = &rb->rb_left; > } else if (prio < p->priority) { > parent = &rb->rb_right; > - first = false; > + *first = false; > } else { > - list_add_tail(&pt->link, &p->requests); > - return false; > + *first = false; > + return p; > } > } > > @@ -661,20 +656,10 @@ insert_request(struct intel_engine_cs *engine, > p = &engine->default_priolist; > } else { > p = kmem_cache_alloc(engine->i915->priorities, GFP_ATOMIC); > - /* Convert an allocation failure to a priority bump */ > + > if (unlikely(!p)) { > - prio = I915_PRIORITY_NORMAL; /* recurses just once */ > - > - /* To maintain ordering with all rendering, after an > - * allocation failure we have to disable all scheduling. > - * Requests will then be executed in fifo, and schedule > - * will ensure that dependencies are emitted in fifo. > - * There will be still some reordering with existing > - * requests, so if userspace lied about their > - * dependencies that reordering may be visible. > - */ > - engine->no_priolist = true; > - goto find_priolist; > + *first = false; > + return ERR_PTR(-ENOMEM); You still have to handle the allocation failure on unsubmit, so keep the goto here. -Chris -- Chris Wilson, Intel Open Source Technology Centre _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx