drm/i915: Remove the impedance mismatch around intel_engine_enable_signaling
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 8 Mar 2018 14:07:32 +0000 (14:07 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 12 Mar 2018 22:06:19 +0000 (22:06 +0000)
There is some redundancy between dma_fence->ops->enable_signaling (via
i915_fence_enable_signaling) and our backend,
intel_engine_enable_signaling() in that both levels recheck the fence
status multiple times. If we convert intel_engine_enable_signaling() to
return the information desired by dma_fence->ops->enable_signaling, we
can reduce i915_fence_enable_signaling to a simple stub and avoid
trying to reinterpret the same information.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Cc: Michal Winiarski <michal.winiarski@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180308140732.25090-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_request.c
drivers/gpu/drm/i915/intel_breadcrumbs.c
drivers/gpu/drm/i915/intel_ringbuffer.h

index 2f62acd2dc3d8f4a2a0551b31754ce606172a134..1810fa1b81cbae53265fc5461ccf3fe0ac94b89b 100644 (file)
@@ -59,11 +59,7 @@ static bool i915_fence_signaled(struct dma_fence *fence)
 
 static bool i915_fence_enable_signaling(struct dma_fence *fence)
 {
-       if (i915_fence_signaled(fence))
-               return false;
-
-       intel_engine_enable_signaling(to_request(fence), true);
-       return !i915_fence_signaled(fence);
+       return intel_engine_enable_signaling(to_request(fence), true);
 }
 
 static signed long i915_fence_wait(struct dma_fence *fence,
index 1f79e7a474338f644e82c76d085a965bfb985d4c..671a6d61e29da618c61f058f23afb9512903997a 100644 (file)
@@ -730,10 +730,11 @@ static void insert_signal(struct intel_breadcrumbs *b,
        list_add(&request->signaling.link, &iter->signaling.link);
 }
 
-void intel_engine_enable_signaling(struct i915_request *request, bool wakeup)
+bool intel_engine_enable_signaling(struct i915_request *request, bool wakeup)
 {
        struct intel_engine_cs *engine = request->engine;
        struct intel_breadcrumbs *b = &engine->breadcrumbs;
+       struct intel_wait *wait = &request->signaling.wait;
        u32 seqno;
 
        /*
@@ -750,12 +751,12 @@ void intel_engine_enable_signaling(struct i915_request *request, bool wakeup)
 
        seqno = i915_request_global_seqno(request);
        if (!seqno) /* will be enabled later upon execution */
-               return;
+               return true;
 
-       GEM_BUG_ON(request->signaling.wait.seqno);
-       request->signaling.wait.tsk = b->signaler;
-       request->signaling.wait.request = request;
-       request->signaling.wait.seqno = seqno;
+       GEM_BUG_ON(wait->seqno);
+       wait->tsk = b->signaler;
+       wait->request = request;
+       wait->seqno = seqno;
 
        /*
         * Add ourselves into the list of waiters, but registering our
@@ -768,11 +769,15 @@ void intel_engine_enable_signaling(struct i915_request *request, bool wakeup)
         */
        spin_lock(&b->rb_lock);
        insert_signal(b, request, seqno);
-       wakeup &= __intel_engine_add_wait(engine, &request->signaling.wait);
+       wakeup &= __intel_engine_add_wait(engine, wait);
        spin_unlock(&b->rb_lock);
 
-       if (wakeup)
+       if (wakeup) {
                wake_up_process(b->signaler);
+               return !intel_wait_complete(wait);
+       }
+
+       return true;
 }
 
 void intel_engine_cancel_signaling(struct i915_request *request)
index c31258d27e20367bbbe71217f04dcf3dc094a4ff..81cdbbf257ec80610b62c906aab840d54be3335d 100644 (file)
@@ -940,7 +940,7 @@ bool intel_engine_add_wait(struct intel_engine_cs *engine,
                           struct intel_wait *wait);
 void intel_engine_remove_wait(struct intel_engine_cs *engine,
                              struct intel_wait *wait);
-void intel_engine_enable_signaling(struct i915_request *request, bool wakeup);
+bool intel_engine_enable_signaling(struct i915_request *request, bool wakeup);
 void intel_engine_cancel_signaling(struct i915_request *request);
 
 static inline bool intel_engine_has_waiter(const struct intel_engine_cs *engine)