Skip to content

Commit

Permalink
drm/i915: Extract active lookup engine to a helper
Browse files Browse the repository at this point in the history
Move active engine lookup to exported i915_request_active_engine.

Signed-off-by: Tvrtko Ursulin <[email protected]>
Reviewed-by: Matthew Auld <[email protected]>
[danvet: Slight rebase, engine->sched.lock is still called
engine->active.lock.]
Signed-off-by: Daniel Vetter <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
  • Loading branch information
tursulin authored and danvet committed Mar 25, 2021
1 parent 5b0a78e commit 7dbc19d
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 33 deletions.
34 changes: 1 addition & 33 deletions drivers/gpu/drm/i915/gem/i915_gem_context.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down
44 changes: 44 additions & 0 deletions drivers/gpu/drm/i915/i915_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 4 additions & 0 deletions drivers/gpu/drm/i915/i915_request.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

0 comments on commit 7dbc19d

Please sign in to comment.