From: Tvrtko Ursulin <tvrtko.ursu...@intel.com>

Move active engine lookup to exported i915_request_active_engine.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursu...@intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_context.c | 34 +---------------
 drivers/gpu/drm/i915/i915_request.c         | 44 +++++++++++++++++++++
 drivers/gpu/drm/i915/i915_request.h         |  4 ++
 3 files changed, 49 insertions(+), 33 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c 
b/drivers/gpu/drm/i915/gem/i915_gem_context.c
index ca37d93ef5e7..03a2f5f2a11f 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
@@ -408,38 +408,6 @@ static bool __cancel_engine(struct intel_engine_cs *engine)
        return intel_engine_pulse(engine) == 0;
 }
 
-static bool
-__active_engine(struct i915_request *rq, struct intel_engine_cs **active)
-{
-       struct intel_engine_cs *engine, *locked;
-       bool ret = false;
-
-       /*
-        * Serialise with __i915_request_submit() so that it sees
-        * is-banned?, or we know the request is already inflight.
-        *
-        * Note that rq->engine is unstable, and so we double
-        * check that we have acquired the lock on the final engine.
-        */
-       locked = READ_ONCE(rq->engine);
-       spin_lock_irq(&locked->sched.lock);
-       while (unlikely(locked != (engine = READ_ONCE(rq->engine)))) {
-               spin_unlock(&locked->sched.lock);
-               locked = engine;
-               spin_lock(&locked->sched.lock);
-       }
-
-       if (i915_request_is_active(rq)) {
-               if (!__i915_request_is_complete(rq))
-                       *active = locked;
-               ret = true;
-       }
-
-       spin_unlock_irq(&locked->sched.lock);
-
-       return ret;
-}
-
 static struct intel_engine_cs *active_engine(struct intel_context *ce)
 {
        struct intel_engine_cs *engine = NULL;
@@ -467,7 +435,7 @@ static struct intel_engine_cs *active_engine(struct 
intel_context *ce)
                /* Check with the backend if the request is inflight */
                found = true;
                if (likely(rcu_access_pointer(rq->timeline) == ce->timeline))
-                       found = __active_engine(rq, &engine);
+                       found = i915_request_active_engine(rq, &engine);
 
                i915_request_put(rq);
                if (found)
diff --git a/drivers/gpu/drm/i915/i915_request.c 
b/drivers/gpu/drm/i915/i915_request.c
index e7b4c4bc41a6..8416b0bc4eb3 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -244,6 +244,50 @@ static void __i915_request_fill(struct i915_request *rq, 
u8 val)
        memset(vaddr + head, val, rq->postfix - head);
 }
 
+/**
+ * i915_request_active_engine
+ * @rq: request to inspect
+ * @active: pointer in which to return the active engine
+ *
+ * Fills the currently active engine to the @active pointer if the request
+ * is active and still not completed.
+ *
+ * Returns true if request was active or false otherwise.
+ */
+bool
+i915_request_active_engine(struct i915_request *rq,
+                          struct intel_engine_cs **active)
+{
+       struct intel_engine_cs *engine, *locked;
+       bool ret = false;
+
+       /*
+        * Serialise with __i915_request_submit() so that it sees
+        * is-banned?, or we know the request is already inflight.
+        *
+        * Note that rq->engine is unstable, and so we double
+        * check that we have acquired the lock on the final engine.
+        */
+       locked = READ_ONCE(rq->engine);
+       spin_lock_irq(&locked->sched.lock);
+       while (unlikely(locked != (engine = READ_ONCE(rq->engine)))) {
+               spin_unlock(&locked->sched.lock);
+               locked = engine;
+               spin_lock(&locked->sched.lock);
+       }
+
+       if (i915_request_is_active(rq)) {
+               if (!__i915_request_is_complete(rq))
+                       *active = locked;
+               ret = true;
+       }
+
+       spin_unlock_irq(&locked->sched.lock);
+
+       return ret;
+}
+
+
 static void remove_from_engine(struct i915_request *rq)
 {
        struct intel_engine_cs *engine, *locked;
diff --git a/drivers/gpu/drm/i915/i915_request.h 
b/drivers/gpu/drm/i915/i915_request.h
index dd10a6db3d21..f5374bab7e69 100644
--- a/drivers/gpu/drm/i915/i915_request.h
+++ b/drivers/gpu/drm/i915/i915_request.h
@@ -650,4 +650,8 @@ static inline bool i915_request_use_semaphores(const struct 
i915_request *rq)
        return intel_engine_has_semaphores(rq->engine);
 }
 
+bool
+i915_request_active_engine(struct i915_request *rq,
+                          struct intel_engine_cs **active);
+
 #endif /* I915_REQUEST_H */
-- 
2.27.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to