Skip to content

Commit

Permalink
drm/i915/execlists: Cache the last priolist lookup
Browse files Browse the repository at this point in the history
Avoid the repeated rbtree lookup for each request as we unwind them by
tracking the last priolist.

v2: Fix up my unhelpful suggestion of using default_priolist.

Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20170928193910.17988-4-chris@chris-wilson.co.uk
  • Loading branch information
Michał Winiarski authored and Chris Wilson committed Sep 29, 2017
1 parent 7d1ea60 commit 097a948
Showing 1 changed file with 13 additions and 7 deletions.
20 changes: 13 additions & 7 deletions drivers/gpu/drm/i915/intel_lrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,25 +358,31 @@ static void unwind_wa_tail(struct drm_i915_gem_request *rq)
static void unwind_incomplete_requests(struct intel_engine_cs *engine)
{
struct drm_i915_gem_request *rq, *rn;
struct i915_priolist *uninitialized_var(p);
int last_prio = I915_PRIORITY_INVALID;

lockdep_assert_held(&engine->timeline->lock);

list_for_each_entry_safe_reverse(rq, rn,
&engine->timeline->requests,
link) {
struct i915_priolist *p;

if (i915_gem_request_completed(rq))
return;

__i915_gem_request_unsubmit(rq);
unwind_wa_tail(rq);

p = lookup_priolist(engine,
&rq->priotree,
rq->priotree.priority);
list_add(&rq->priotree.link,
&ptr_mask_bits(p, 1)->requests);
GEM_BUG_ON(rq->priotree.priority == I915_PRIORITY_INVALID);
if (rq->priotree.priority != last_prio) {
p = lookup_priolist(engine,
&rq->priotree,
rq->priotree.priority);
p = ptr_mask_bits(p, 1);

last_prio = rq->priotree.priority;
}

list_add(&rq->priotree.link, &p->requests);
}
}

Expand Down

0 comments on commit 097a948

Please sign in to comment.