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

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
...@@ -3256,11 +3256,11 @@ static int i915_engine_info(struct seq_file *m, void *unused) ...@@ -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)));
......
...@@ -2717,12 +2717,16 @@ static void i915_gem_cleanup_engine(struct intel_engine_cs *engine) ...@@ -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);
} }
} }
......
...@@ -237,7 +237,6 @@ static void intel_engine_init_timeline(struct intel_engine_cs *engine) ...@@ -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);
......
...@@ -471,7 +471,6 @@ static void execlists_dequeue(struct intel_engine_cs *engine) ...@@ -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) ...@@ -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) ...@@ -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)
......
...@@ -335,7 +335,6 @@ struct intel_engine_cs { ...@@ -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;
......
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