Commit 7dbc19da authored by Tvrtko Ursulin's avatar Tvrtko Ursulin Committed by Daniel Vetter

drm/i915: Extract active lookup engine to a helper

Move active engine lookup to exported i915_request_active_engine.
Signed-off-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
[danvet: Slight rebase, engine->sched.lock is still called
engine->active.lock.]
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20210324121335.2307063-2-tvrtko.ursulin@linux.intel.com
parent 5b0a78ec
...@@ -386,38 +386,6 @@ static bool __cancel_engine(struct intel_engine_cs *engine) ...@@ -386,38 +386,6 @@ static bool __cancel_engine(struct intel_engine_cs *engine)
return intel_engine_pulse(engine) == 0; 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->active.lock);
while (unlikely(locked != (engine = READ_ONCE(rq->engine)))) {
spin_unlock(&locked->active.lock);
locked = engine;
spin_lock(&locked->active.lock);
}
if (i915_request_is_active(rq)) {
if (!__i915_request_is_complete(rq))
*active = locked;
ret = true;
}
spin_unlock_irq(&locked->active.lock);
return ret;
}
static struct intel_engine_cs *active_engine(struct intel_context *ce) static struct intel_engine_cs *active_engine(struct intel_context *ce)
{ {
struct intel_engine_cs *engine = NULL; struct intel_engine_cs *engine = NULL;
...@@ -445,7 +413,7 @@ static struct intel_engine_cs *active_engine(struct intel_context *ce) ...@@ -445,7 +413,7 @@ static struct intel_engine_cs *active_engine(struct intel_context *ce)
/* Check with the backend if the request is inflight */ /* Check with the backend if the request is inflight */
found = true; found = true;
if (likely(rcu_access_pointer(rq->timeline) == ce->timeline)) 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); i915_request_put(rq);
if (found) if (found)
......
...@@ -244,6 +244,50 @@ static void __i915_request_fill(struct i915_request *rq, u8 val) ...@@ -244,6 +244,50 @@ static void __i915_request_fill(struct i915_request *rq, u8 val)
memset(vaddr + head, val, rq->postfix - head); 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->active.lock);
while (unlikely(locked != (engine = READ_ONCE(rq->engine)))) {
spin_unlock(&locked->active.lock);
locked = engine;
spin_lock(&locked->active.lock);
}
if (i915_request_is_active(rq)) {
if (!__i915_request_is_complete(rq))
*active = locked;
ret = true;
}
spin_unlock_irq(&locked->active.lock);
return ret;
}
static void remove_from_engine(struct i915_request *rq) static void remove_from_engine(struct i915_request *rq)
{ {
struct intel_engine_cs *engine, *locked; struct intel_engine_cs *engine, *locked;
......
...@@ -627,4 +627,8 @@ i915_request_active_seqno(const struct i915_request *rq) ...@@ -627,4 +627,8 @@ i915_request_active_seqno(const struct i915_request *rq)
return hwsp_phys_base + hwsp_relative_offset; return hwsp_phys_base + hwsp_relative_offset;
} }
bool
i915_request_active_engine(struct i915_request *rq,
struct intel_engine_cs **active);
#endif /* I915_REQUEST_H */ #endif /* I915_REQUEST_H */
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