drm/i915: Remove engine->execlist_lock
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 14 Nov 2016 20:41:00 +0000 (20:41 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 14 Nov 2016 21:00:25 +0000 (21:00 +0000)
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: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20161114204105.29171-5-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/intel_engine_cs.c
drivers/gpu/drm/i915/intel_lrc.c
drivers/gpu/drm/i915/intel_ringbuffer.h

index b681d422883a5dbc200c420dcd1a4c5fe9b1db23..5832758fccacdcf236fcbf3852d210bb46f2be57 100644 (file)
@@ -3256,11 +3256,11 @@ static int i915_engine_info(struct seq_file *m, void *unused)
                                seq_printf(m, "\t\tELSP[1] idle\n");
                        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) {
                                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) {
                        seq_printf(m, "\tPP_DIR_BASE: 0x%08x\n",
                                   I915_READ(RING_PP_DIR_BASE(engine)));
index a6ae3efd1d6aaf16a0262f446aeaa5ffa9970369..9741f1a1964948cec28be692aaa93f98ed5a511b 100644 (file)
@@ -2717,12 +2717,16 @@ static void i915_gem_cleanup_engine(struct intel_engine_cs *engine)
         */
 
        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);
                i915_gem_request_put(engine->execlist_port[0].request);
                i915_gem_request_put(engine->execlist_port[1].request);
                memset(engine->execlist_port, 0, sizeof(engine->execlist_port));
-               spin_unlock(&engine->execlist_lock);
+
+               spin_unlock_irqrestore(&engine->timeline->lock, flags);
        }
 }
 
index 841f8d1e1410341e5327391a2ea5aac70883ed34..298f0f95dd3f83696d7b1473a89cf06c61a28c7e 100644 (file)
@@ -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)
 {
        INIT_LIST_HEAD(&engine->execlist_queue);
-       spin_lock_init(&engine->execlist_lock);
 
        intel_engine_init_timeline(engine);
        intel_engine_init_hangcheck(engine);
index dca41834dec1054bce436efa9add8f88f0209bd7..d1aea746251549646761eb32404e471419f9a69d 100644 (file)
@@ -471,7 +471,6 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
         */
 
        spin_lock_irqsave(&engine->timeline->lock, flags);
-       spin_lock(&engine->execlist_lock);
        list_for_each_entry(cursor, &engine->execlist_queue, execlist_link) {
                /* Can we combine this request with the current port? It has to
                 * 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);
        }
-       spin_unlock(&engine->execlist_lock);
        spin_unlock_irqrestore(&engine->timeline->lock, flags);
 
        if (submit)
@@ -633,13 +631,14 @@ static void execlists_submit_request(struct drm_i915_gem_request *request)
        struct intel_engine_cs *engine = request->engine;
        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);
        if (execlists_elsp_idle(engine))
                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)
index d1a728791ad47e53db778284838512cca8a99c63..e1351870c2034c7a59969da104cc214b3998a931 100644 (file)
@@ -335,7 +335,6 @@ struct intel_engine_cs {
 
        /* Execlists */
        struct tasklet_struct irq_tasklet;
-       spinlock_t execlist_lock; /* used inside tasklet, use spin_lock_bh */
        struct execlist_port {
                struct drm_i915_gem_request *request;
                unsigned int count;