drm/xe/ct: serialise fast_lock during CT disable
The fast-path CT could be running as we enter a runtime-suspend or potentially a GT reset, however here we only use the ct->fast_lock and not the full ct->lock. Before disabling the CT, also serialise against the fast_lock to ensure any in-progress work finishes before we start nuking the CT related stuff. Once we disable ct->enabled and drop the lock, any new work should fail gracefully, and anything that was in progress should be finished. Signed-off-by: Matthew Auld <matthew.auld@intel.com> Cc: Matthew Brost <matthew.brost@intel.com> Cc: José Roberto de Souza <jose.souza@intel.com> Reviewed-by: Matthew Brost <matthew.brost@intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
This commit is contained in:
parent
4803f6e26f
commit
a4d362bbed
@ -301,8 +301,10 @@ int xe_guc_ct_enable(struct xe_guc_ct *ct)
|
||||
goto err_out;
|
||||
|
||||
mutex_lock(&ct->lock);
|
||||
spin_lock_irq(&ct->fast_lock);
|
||||
ct->g2h_outstanding = 0;
|
||||
ct->enabled = true;
|
||||
spin_unlock_irq(&ct->fast_lock);
|
||||
mutex_unlock(&ct->lock);
|
||||
|
||||
smp_mb();
|
||||
@ -319,8 +321,10 @@ err_out:
|
||||
|
||||
void xe_guc_ct_disable(struct xe_guc_ct *ct)
|
||||
{
|
||||
mutex_lock(&ct->lock);
|
||||
ct->enabled = false;
|
||||
mutex_lock(&ct->lock); /* Serialise dequeue_one_g2h() */
|
||||
spin_lock_irq(&ct->fast_lock); /* Serialise CT fast-path */
|
||||
ct->enabled = false; /* Finally disable CT communication */
|
||||
spin_unlock_irq(&ct->fast_lock);
|
||||
mutex_unlock(&ct->lock);
|
||||
|
||||
xa_destroy(&ct->fence_lookup);
|
||||
|
Loading…
x
Reference in New Issue
Block a user