Commit 663f71e7 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Remove engine->execlist_lock



The execlist_lock is now completely subsumed by the engine->timeline->lock,
and so we can remove the redundant layer of locking.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20161114204105.29171-5-chris@chris-wilson.co.uk
parent d55ac5bf
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -3256,11 +3256,11 @@ static int i915_engine_info(struct seq_file *m, void *unused)
				seq_printf(m, "\t\tELSP[1] idle\n");
				seq_printf(m, "\t\tELSP[1] idle\n");
			rcu_read_unlock();
			rcu_read_unlock();


			spin_lock_irq(&engine->execlist_lock);
			spin_lock_irq(&engine->timeline->lock);
			list_for_each_entry(rq, &engine->execlist_queue, execlist_link) {
			list_for_each_entry(rq, &engine->execlist_queue, execlist_link) {
				print_request(m, rq, "\t\tQ ");
				print_request(m, rq, "\t\tQ ");
			}
			}
			spin_unlock_irq(&engine->execlist_lock);
			spin_unlock_irq(&engine->timeline->lock);
		} else if (INTEL_GEN(dev_priv) > 6) {
		} else if (INTEL_GEN(dev_priv) > 6) {
			seq_printf(m, "\tPP_DIR_BASE: 0x%08x\n",
			seq_printf(m, "\tPP_DIR_BASE: 0x%08x\n",
				   I915_READ(RING_PP_DIR_BASE(engine)));
				   I915_READ(RING_PP_DIR_BASE(engine)));
+6 −2
Original line number Original line Diff line number Diff line
@@ -2717,12 +2717,16 @@ static void i915_gem_cleanup_engine(struct intel_engine_cs *engine)
	 */
	 */


	if (i915.enable_execlists) {
	if (i915.enable_execlists) {
		spin_lock(&engine->execlist_lock);
		unsigned long flags;

		spin_lock_irqsave(&engine->timeline->lock, flags);

		INIT_LIST_HEAD(&engine->execlist_queue);
		INIT_LIST_HEAD(&engine->execlist_queue);
		i915_gem_request_put(engine->execlist_port[0].request);
		i915_gem_request_put(engine->execlist_port[0].request);
		i915_gem_request_put(engine->execlist_port[1].request);
		i915_gem_request_put(engine->execlist_port[1].request);
		memset(engine->execlist_port, 0, sizeof(engine->execlist_port));
		memset(engine->execlist_port, 0, sizeof(engine->execlist_port));
		spin_unlock(&engine->execlist_lock);

		spin_unlock_irqrestore(&engine->timeline->lock, flags);
	}
	}
}
}


+0 −1
Original line number Original line Diff line number Diff line
@@ -237,7 +237,6 @@ static void intel_engine_init_timeline(struct intel_engine_cs *engine)
void intel_engine_setup_common(struct intel_engine_cs *engine)
void intel_engine_setup_common(struct intel_engine_cs *engine)
{
{
	INIT_LIST_HEAD(&engine->execlist_queue);
	INIT_LIST_HEAD(&engine->execlist_queue);
	spin_lock_init(&engine->execlist_lock);


	intel_engine_init_timeline(engine);
	intel_engine_init_timeline(engine);
	intel_engine_init_hangcheck(engine);
	intel_engine_init_hangcheck(engine);
+3 −4
Original line number Original line Diff line number Diff line
@@ -471,7 +471,6 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
	 */
	 */


	spin_lock_irqsave(&engine->timeline->lock, flags);
	spin_lock_irqsave(&engine->timeline->lock, flags);
	spin_lock(&engine->execlist_lock);
	list_for_each_entry(cursor, &engine->execlist_queue, execlist_link) {
	list_for_each_entry(cursor, &engine->execlist_queue, execlist_link) {
		/* Can we combine this request with the current port? It has to
		/* Can we combine this request with the current port? It has to
		 * be the same context/ringbuffer and not have any exceptions
		 * be the same context/ringbuffer and not have any exceptions
@@ -524,7 +523,6 @@ static void execlists_dequeue(struct intel_engine_cs *engine)


		i915_gem_request_assign(&port->request, last);
		i915_gem_request_assign(&port->request, last);
	}
	}
	spin_unlock(&engine->execlist_lock);
	spin_unlock_irqrestore(&engine->timeline->lock, flags);
	spin_unlock_irqrestore(&engine->timeline->lock, flags);


	if (submit)
	if (submit)
@@ -633,13 +631,14 @@ 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;
	unsigned long flags;
	unsigned long flags;


	spin_lock_irqsave(&engine->execlist_lock, flags);
	/* Will be called from irq-context when using foreign fences. */
	spin_lock_irqsave(&engine->timeline->lock, flags);


	list_add_tail(&request->execlist_link, &engine->execlist_queue);
	list_add_tail(&request->execlist_link, &engine->execlist_queue);
	if (execlists_elsp_idle(engine))
	if (execlists_elsp_idle(engine))
		tasklet_hi_schedule(&engine->irq_tasklet);
		tasklet_hi_schedule(&engine->irq_tasklet);


	spin_unlock_irqrestore(&engine->execlist_lock, flags);
	spin_unlock_irqrestore(&engine->timeline->lock, flags);
}
}


int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request)
int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request)
+0 −1
Original line number Original line Diff line number Diff line
@@ -335,7 +335,6 @@ struct intel_engine_cs {


	/* Execlists */
	/* Execlists */
	struct tasklet_struct irq_tasklet;
	struct tasklet_struct irq_tasklet;
	spinlock_t execlist_lock; /* used inside tasklet, use spin_lock_bh */
	struct execlist_port {
	struct execlist_port {
		struct drm_i915_gem_request *request;
		struct drm_i915_gem_request *request;
		unsigned int count;
		unsigned int count;