drm/i915: Extract active lookup engine to a helper
Move active engine lookup to exported i915_request_active_engine. Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Matthew Auld <matthew.auld@intel.com> [danvet: Slight rebase, engine->sched.lock is still called engine->active.lock.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://patchwork.freedesktop.org/patch/msgid/20210324121335.2307063-2-tvrtko.ursulin@linux.intel.com
This commit is contained in:
parent
5b0a78ec0b
commit
7dbc19da5d
@ -386,38 +386,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->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)
|
||||
{
|
||||
struct intel_engine_cs *engine = NULL;
|
||||
@ -445,7 +413,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)
|
||||
|
@ -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->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)
|
||||
{
|
||||
struct intel_engine_cs *engine, *locked;
|
||||
|
@ -627,4 +627,8 @@ i915_request_active_seqno(const struct i915_request *rq)
|
||||
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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user