Skip to content

Commit 9777d8b

Browse files
icklejnikula
authored andcommitted
drm/i915/execlists: Track active elements during dequeue
Record the initial active element we use when building the next ELSP submission, so that we can compare against it latter to see if there's no change. Fixes: 44d0a9c ("drm/i915/execlists: Skip redundant resubmission") Signed-off-by: Chris Wilson <[email protected]> Reviewed-by: Mika Kuoppala <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] (cherry picked from commit 60ef5b7) Signed-off-by: Jani Nikula <[email protected]>
1 parent fb33c65 commit 9777d8b

File tree

1 file changed

+12
-20
lines changed

1 file changed

+12
-20
lines changed

drivers/gpu/drm/i915/gt/intel_lrc.c

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1600,17 +1600,6 @@ static void virtual_xfer_breadcrumbs(struct virtual_engine *ve,
16001600
spin_unlock(&old->breadcrumbs.irq_lock);
16011601
}
16021602

1603-
static struct i915_request *
1604-
last_active(const struct intel_engine_execlists *execlists)
1605-
{
1606-
struct i915_request * const *last = READ_ONCE(execlists->active);
1607-
1608-
while (*last && i915_request_completed(*last))
1609-
last++;
1610-
1611-
return *last;
1612-
}
1613-
16141603
#define for_each_waiter(p__, rq__) \
16151604
list_for_each_entry_lockless(p__, \
16161605
&(rq__)->sched.waiters_list, \
@@ -1740,11 +1729,9 @@ static void record_preemption(struct intel_engine_execlists *execlists)
17401729
(void)I915_SELFTEST_ONLY(execlists->preempt_hang.count++);
17411730
}
17421731

1743-
static unsigned long active_preempt_timeout(struct intel_engine_cs *engine)
1732+
static unsigned long active_preempt_timeout(struct intel_engine_cs *engine,
1733+
const struct i915_request *rq)
17441734
{
1745-
struct i915_request *rq;
1746-
1747-
rq = last_active(&engine->execlists);
17481735
if (!rq)
17491736
return 0;
17501737

@@ -1755,13 +1742,14 @@ static unsigned long active_preempt_timeout(struct intel_engine_cs *engine)
17551742
return READ_ONCE(engine->props.preempt_timeout_ms);
17561743
}
17571744

1758-
static void set_preempt_timeout(struct intel_engine_cs *engine)
1745+
static void set_preempt_timeout(struct intel_engine_cs *engine,
1746+
const struct i915_request *rq)
17591747
{
17601748
if (!intel_engine_has_preempt_reset(engine))
17611749
return;
17621750

17631751
set_timer_ms(&engine->execlists.preempt,
1764-
active_preempt_timeout(engine));
1752+
active_preempt_timeout(engine, rq));
17651753
}
17661754

17671755
static inline void clear_ports(struct i915_request **ports, int count)
@@ -1774,6 +1762,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
17741762
struct intel_engine_execlists * const execlists = &engine->execlists;
17751763
struct i915_request **port = execlists->pending;
17761764
struct i915_request ** const last_port = port + execlists->port_mask;
1765+
struct i915_request * const *active;
17771766
struct i915_request *last;
17781767
struct rb_node *rb;
17791768
bool submit = false;
@@ -1828,7 +1817,10 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
18281817
* i.e. we will retrigger preemption following the ack in case
18291818
* of trouble.
18301819
*/
1831-
last = last_active(execlists);
1820+
active = READ_ONCE(execlists->active);
1821+
while ((last = *active) && i915_request_completed(last))
1822+
active++;
1823+
18321824
if (last) {
18331825
if (need_preempt(engine, last, rb)) {
18341826
ENGINE_TRACE(engine,
@@ -2110,7 +2102,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
21102102
* Skip if we ended up with exactly the same set of requests,
21112103
* e.g. trying to timeslice a pair of ordered contexts
21122104
*/
2113-
if (!memcmp(execlists->active, execlists->pending,
2105+
if (!memcmp(active, execlists->pending,
21142106
(port - execlists->pending + 1) * sizeof(*port))) {
21152107
do
21162108
execlists_schedule_out(fetch_and_zero(port));
@@ -2121,7 +2113,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
21212113
clear_ports(port + 1, last_port - port);
21222114

21232115
execlists_submit_ports(engine);
2124-
set_preempt_timeout(engine);
2116+
set_preempt_timeout(engine, *active);
21252117
} else {
21262118
skip_submit:
21272119
ring_set_paused(engine, 0);

0 commit comments

Comments
 (0)