mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-04 10:56:06 -04:00
drm/i915/gt/uc: Evaluate GuC priority within locks
The ce->guc_state.lock was made to protect guc_prio, which indicates the GuC priority level. But at the begnning of the function we perform some sanity check of guc_prio outside its protected section. Move them within the locked region. Use this occasion to expand the if statement to make it clearer. Signed-off-by: Andi Shyti <andi.shyti@linux.intel.com> Cc: Matthew Brost <matthew.brost@intel.com> Reviewed-by: Matthew Brost <matthew.brost@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240613222402.551625-2-andi.shyti@linux.intel.com
This commit is contained in:
@@ -4267,20 +4267,25 @@ static void guc_bump_inflight_request_prio(struct i915_request *rq,
|
||||
u8 new_guc_prio = map_i915_prio_to_guc_prio(prio);
|
||||
|
||||
/* Short circuit function */
|
||||
if (prio < I915_PRIORITY_NORMAL ||
|
||||
rq->guc_prio == GUC_PRIO_FINI ||
|
||||
(rq->guc_prio != GUC_PRIO_INIT &&
|
||||
!new_guc_prio_higher(rq->guc_prio, new_guc_prio)))
|
||||
if (prio < I915_PRIORITY_NORMAL)
|
||||
return;
|
||||
|
||||
spin_lock(&ce->guc_state.lock);
|
||||
if (rq->guc_prio != GUC_PRIO_FINI) {
|
||||
if (rq->guc_prio != GUC_PRIO_INIT)
|
||||
sub_context_inflight_prio(ce, rq->guc_prio);
|
||||
rq->guc_prio = new_guc_prio;
|
||||
add_context_inflight_prio(ce, rq->guc_prio);
|
||||
update_context_prio(ce);
|
||||
}
|
||||
|
||||
if (rq->guc_prio == GUC_PRIO_FINI)
|
||||
goto exit;
|
||||
|
||||
if (!new_guc_prio_higher(rq->guc_prio, new_guc_prio))
|
||||
goto exit;
|
||||
|
||||
if (rq->guc_prio != GUC_PRIO_INIT)
|
||||
sub_context_inflight_prio(ce, rq->guc_prio);
|
||||
|
||||
rq->guc_prio = new_guc_prio;
|
||||
add_context_inflight_prio(ce, rq->guc_prio);
|
||||
update_context_prio(ce);
|
||||
|
||||
exit:
|
||||
spin_unlock(&ce->guc_state.lock);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user