mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 15:12:13 +02:00
drm/i915/gt: Only retire on the last breadcrumb if the last request
We use the completion of the last active breadcrumb to retire the requests along a timeline. This is purely opportunistic as nothing guarantees that any particular timeline is terminated by a breadcrumb; except for parking the engine where we explicitly add a breadcrumb so that we park quickly and do an explicit retire upon signaling to reduce the latency dramatically (avoiding a retire worker roundtrip). With scheduling, we anticipate retiring completed timelines as a matter of course. Performing the same action from inside the breadcrumbs is intended to provide similar functionality for legacy ringbuffer submission. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Andi Shyti <andi.shyti@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20210108204026.20682-5-chris@chris-wilson.co.uk
This commit is contained in:
parent
2b2985a417
commit
b1ad5f6d68
|
|
@ -257,17 +257,17 @@ static void signal_irq_work(struct irq_work *work)
|
|||
list_del_rcu(&rq->signal_link);
|
||||
release = remove_signaling_context(b, ce);
|
||||
spin_unlock(&ce->signal_lock);
|
||||
if (release) {
|
||||
if (intel_timeline_is_last(ce->timeline, rq))
|
||||
add_retire(b, ce->timeline);
|
||||
intel_context_put(ce);
|
||||
}
|
||||
|
||||
if (__dma_fence_signal(&rq->fence))
|
||||
/* We own signal_node now, xfer to local list */
|
||||
signal = slist_add(&rq->signal_node, signal);
|
||||
else
|
||||
i915_request_put(rq);
|
||||
|
||||
if (release) {
|
||||
add_retire(b, ce->timeline);
|
||||
intel_context_put(ce);
|
||||
}
|
||||
}
|
||||
}
|
||||
atomic_dec(&b->signaler_active);
|
||||
|
|
|
|||
|
|
@ -640,7 +640,7 @@ static inline void __execlists_schedule_out(struct i915_request *rq)
|
|||
* If we have just completed this context, the engine may now be
|
||||
* idle and we want to re-enter powersaving.
|
||||
*/
|
||||
if (list_is_last_rcu(&rq->link, &ce->timeline->requests) &&
|
||||
if (intel_timeline_is_last(ce->timeline, rq) &&
|
||||
__i915_request_is_complete(rq))
|
||||
intel_engine_add_retire(engine, ce->timeline);
|
||||
|
||||
|
|
|
|||
|
|
@ -110,4 +110,11 @@ void intel_gt_show_timelines(struct intel_gt *gt,
|
|||
const char *prefix,
|
||||
int indent));
|
||||
|
||||
static inline bool
|
||||
intel_timeline_is_last(const struct intel_timeline *tl,
|
||||
const struct i915_request *rq)
|
||||
{
|
||||
return list_is_last_rcu(&rq->link, &tl->requests);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user