Commit 27606fd8 authored by Chris Wilson's avatar Chris Wilson

drm/i915/execlists: Split insert_request()

In the next patch we will want to reinsert a request not at the end of
the priority queue, but at the front. Here we split insert_request()
into two, the first function retrieves the priority list (for reuse for
unsubmit later) and a wrapper function to insert at the end of that list
and to schedule the tasklet if we were first.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarMichał Winiarski <michal.winiarski@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20170916204414.32762-3-chris@chris-wilson.co.uk
parent 08dd3e1a
...@@ -286,10 +286,10 @@ intel_lr_context_descriptor_update(struct i915_gem_context *ctx, ...@@ -286,10 +286,10 @@ intel_lr_context_descriptor_update(struct i915_gem_context *ctx,
ce->lrc_desc = desc; ce->lrc_desc = desc;
} }
static bool static struct i915_priolist *
insert_request(struct intel_engine_cs *engine, lookup_priolist(struct intel_engine_cs *engine,
struct i915_priotree *pt, struct i915_priotree *pt,
int prio) int prio)
{ {
struct i915_priolist *p; struct i915_priolist *p;
struct rb_node **parent, *rb; struct rb_node **parent, *rb;
...@@ -311,8 +311,7 @@ insert_request(struct intel_engine_cs *engine, ...@@ -311,8 +311,7 @@ insert_request(struct intel_engine_cs *engine,
parent = &rb->rb_right; parent = &rb->rb_right;
first = false; first = false;
} else { } else {
list_add_tail(&pt->link, &p->requests); return p;
return false;
} }
} }
...@@ -338,16 +337,14 @@ insert_request(struct intel_engine_cs *engine, ...@@ -338,16 +337,14 @@ insert_request(struct intel_engine_cs *engine,
} }
p->priority = prio; p->priority = prio;
INIT_LIST_HEAD(&p->requests);
rb_link_node(&p->node, rb, parent); rb_link_node(&p->node, rb, parent);
rb_insert_color(&p->node, &engine->execlist_queue); rb_insert_color(&p->node, &engine->execlist_queue);
INIT_LIST_HEAD(&p->requests);
list_add_tail(&pt->link, &p->requests);
if (first) if (first)
engine->execlist_first = &p->node; engine->execlist_first = &p->node;
return first; return ptr_pack_bits(p, first, 1);
} }
static inline void static inline void
...@@ -764,6 +761,17 @@ static void intel_lrc_irq_handler(unsigned long data) ...@@ -764,6 +761,17 @@ static void intel_lrc_irq_handler(unsigned long data)
intel_uncore_forcewake_put(dev_priv, engine->fw_domains); intel_uncore_forcewake_put(dev_priv, engine->fw_domains);
} }
static void insert_request(struct intel_engine_cs *engine,
struct i915_priotree *pt,
int prio)
{
struct i915_priolist *p = lookup_priolist(engine, pt, prio);
list_add_tail(&pt->link, &ptr_mask_bits(p, 1)->requests);
if (ptr_unmask_bits(p, 1) && execlists_elsp_ready(engine))
tasklet_hi_schedule(&engine->irq_tasklet);
}
static void execlists_submit_request(struct drm_i915_gem_request *request) static void execlists_submit_request(struct drm_i915_gem_request *request)
{ {
struct intel_engine_cs *engine = request->engine; struct intel_engine_cs *engine = request->engine;
...@@ -772,12 +780,7 @@ static void execlists_submit_request(struct drm_i915_gem_request *request) ...@@ -772,12 +780,7 @@ static void execlists_submit_request(struct drm_i915_gem_request *request)
/* Will be called from irq-context when using foreign fences. */ /* Will be called from irq-context when using foreign fences. */
spin_lock_irqsave(&engine->timeline->lock, flags); spin_lock_irqsave(&engine->timeline->lock, flags);
if (insert_request(engine, insert_request(engine, &request->priotree, request->priotree.priority);
&request->priotree,
request->priotree.priority)) {
if (execlists_elsp_ready(engine))
tasklet_hi_schedule(&engine->irq_tasklet);
}
GEM_BUG_ON(!engine->execlist_first); GEM_BUG_ON(!engine->execlist_first);
GEM_BUG_ON(list_empty(&request->priotree.link)); GEM_BUG_ON(list_empty(&request->priotree.link));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment