diff options
author | Matthew Auld <matthew.auld@intel.com> | 2023-07-10 10:40:44 +0100 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2023-12-21 11:35:23 -0500 |
commit | a4d362bbed8c86a632b5e22bf64d9c5564e3766e (patch) | |
tree | d8d5d5eebf42d398c0442b597c969455fc496cd6 /drivers/gpu/drm/xe/xe_guc_ct.c | |
parent | 4803f6e26f1678b8b5af2924199bc137e7ec5fad (diff) |
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>
Diffstat (limited to 'drivers/gpu/drm/xe/xe_guc_ct.c')
-rw-r--r-- | drivers/gpu/drm/xe/xe_guc_ct.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c index ba89db1dcfdb..acf488b00b66 100644 --- a/drivers/gpu/drm/xe/xe_guc_ct.c +++ b/drivers/gpu/drm/xe/xe_guc_ct.c @@ -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); |