Commit a4d362bb authored by Matthew Auld's avatar Matthew Auld Committed by Rodrigo Vivi

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: default avatarMatthew Auld <matthew.auld@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: José Roberto de Souza <jose.souza@intel.com>
Reviewed-by: default avatarMatthew Brost <matthew.brost@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent 4803f6e2
......@@ -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 @@ int xe_guc_ct_enable(struct xe_guc_ct *ct)
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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment