Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+19 −16
Original line number Original line Diff line number Diff line
@@ -286,8 +286,8 @@ 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)
{
{
@@ -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,
	}
	}


	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)
	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)
	/* 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));