Skip to content

Commit 89e96d8

Browse files
unerligejlahtine-intel
authored andcommitted
i915/guc/reset: Make __guc_reset_context aware of guilty engines
There are 2 ways an engine can get reset in i915 and the method of reset affects how KMD labels a context as guilty/innocent. (1) GuC initiated engine-reset: GuC resets a hung engine and notifies KMD. The context that hung on the engine is marked guilty and all other contexts are innocent. The innocent contexts are resubmitted. (2) GT based reset: When an engine heartbeat fails to tick, KMD initiates a gt/chip reset. All active contexts are marked as guilty and discarded. In order to correctly mark the contexts as guilty/innocent, pass a mask of engines that were reset to __guc_reset_context. Fixes: eb5e7da ("drm/i915/guc: Reset implementation for new GuC interface") Signed-off-by: Umesh Nerlige Ramappa <[email protected]> Reviewed-by: Alan Previn <[email protected]> Signed-off-by: John Harrison <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] (cherry picked from commit 303760a) Signed-off-by: Joonas Lahtinen <[email protected]>
1 parent 54395a3 commit 89e96d8

File tree

5 files changed

+12
-12
lines changed

5 files changed

+12
-12
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,7 @@ static int gt_reset(struct intel_gt *gt, intel_engine_mask_t stalled_mask)
806806
__intel_engine_reset(engine, stalled_mask & engine->mask);
807807
local_bh_enable();
808808

809-
intel_uc_reset(&gt->uc, true);
809+
intel_uc_reset(&gt->uc, ALL_ENGINES);
810810

811811
intel_ggtt_restore_fences(gt->ggtt);
812812

drivers/gpu/drm/i915/gt/uc/intel_guc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ int intel_guc_global_policies_update(struct intel_guc *guc);
438438
void intel_guc_context_ban(struct intel_context *ce, struct i915_request *rq);
439439

440440
void intel_guc_submission_reset_prepare(struct intel_guc *guc);
441-
void intel_guc_submission_reset(struct intel_guc *guc, bool stalled);
441+
void intel_guc_submission_reset(struct intel_guc *guc, intel_engine_mask_t stalled);
442442
void intel_guc_submission_reset_finish(struct intel_guc *guc);
443443
void intel_guc_submission_cancel_requests(struct intel_guc *guc);
444444

drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1590,9 +1590,9 @@ __unwind_incomplete_requests(struct intel_context *ce)
15901590
spin_unlock_irqrestore(&sched_engine->lock, flags);
15911591
}
15921592

1593-
static void __guc_reset_context(struct intel_context *ce, bool stalled)
1593+
static void __guc_reset_context(struct intel_context *ce, intel_engine_mask_t stalled)
15941594
{
1595-
bool local_stalled;
1595+
bool guilty;
15961596
struct i915_request *rq;
15971597
unsigned long flags;
15981598
u32 head;
@@ -1620,22 +1620,22 @@ static void __guc_reset_context(struct intel_context *ce, bool stalled)
16201620
if (!intel_context_is_pinned(ce))
16211621
goto next_context;
16221622

1623-
local_stalled = false;
1623+
guilty = false;
16241624
rq = intel_context_find_active_request(ce);
16251625
if (!rq) {
16261626
head = ce->ring->tail;
16271627
goto out_replay;
16281628
}
16291629

16301630
if (i915_request_started(rq))
1631-
local_stalled = true;
1631+
guilty = stalled & ce->engine->mask;
16321632

16331633
GEM_BUG_ON(i915_active_is_idle(&ce->active));
16341634
head = intel_ring_wrap(ce->ring, rq->head);
16351635

1636-
__i915_request_reset(rq, local_stalled && stalled);
1636+
__i915_request_reset(rq, guilty);
16371637
out_replay:
1638-
guc_reset_state(ce, head, local_stalled && stalled);
1638+
guc_reset_state(ce, head, guilty);
16391639
next_context:
16401640
if (i != number_children)
16411641
ce = list_next_entry(ce, parallel.child_link);
@@ -1645,7 +1645,7 @@ static void __guc_reset_context(struct intel_context *ce, bool stalled)
16451645
intel_context_put(parent);
16461646
}
16471647

1648-
void intel_guc_submission_reset(struct intel_guc *guc, bool stalled)
1648+
void intel_guc_submission_reset(struct intel_guc *guc, intel_engine_mask_t stalled)
16491649
{
16501650
struct intel_context *ce;
16511651
unsigned long index;
@@ -4013,7 +4013,7 @@ static void guc_context_replay(struct intel_context *ce)
40134013
{
40144014
struct i915_sched_engine *sched_engine = ce->engine->sched_engine;
40154015

4016-
__guc_reset_context(ce, true);
4016+
__guc_reset_context(ce, ce->engine->mask);
40174017
tasklet_hi_schedule(&sched_engine->tasklet);
40184018
}
40194019

drivers/gpu/drm/i915/gt/uc/intel_uc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,7 @@ void intel_uc_reset_prepare(struct intel_uc *uc)
593593
__uc_sanitize(uc);
594594
}
595595

596-
void intel_uc_reset(struct intel_uc *uc, bool stalled)
596+
void intel_uc_reset(struct intel_uc *uc, intel_engine_mask_t stalled)
597597
{
598598
struct intel_guc *guc = &uc->guc;
599599

drivers/gpu/drm/i915/gt/uc/intel_uc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ void intel_uc_driver_late_release(struct intel_uc *uc);
4242
void intel_uc_driver_remove(struct intel_uc *uc);
4343
void intel_uc_init_mmio(struct intel_uc *uc);
4444
void intel_uc_reset_prepare(struct intel_uc *uc);
45-
void intel_uc_reset(struct intel_uc *uc, bool stalled);
45+
void intel_uc_reset(struct intel_uc *uc, intel_engine_mask_t stalled);
4646
void intel_uc_reset_finish(struct intel_uc *uc);
4747
void intel_uc_cancel_requests(struct intel_uc *uc);
4848
void intel_uc_suspend(struct intel_uc *uc);

0 commit comments

Comments
 (0)