Skip to content

Commit ce5059b

Browse files
stuartsummersmbrost05
authored andcommitted
drm/xe: Move explicit CT lock in TLB invalidation sequence
Currently the CT lock is used to cover TLB invalidation sequence number updates. In an effort to separate the GuC back end tracking of communication with the firmware from the front end TLB sequence number tracking, add a new lock here to specifically track those sequence number updates coming in from the user. Apart from the CT lock, we also have a pending lock to cover both pending fences and sequence numbers received from the back end. Those cover interrupt cases and so it makes not to overload those with sequence numbers coming in from new transactions. In that way, we'll employ a mutex here. v2: Actually add the correct lock rather than just dropping it... (Matt) Signed-off-by: Stuart Summers <stuart.summers@intel.com> Reviewed-by: Matthew Brost <matthew.brost@intel.com> Signed-off-by: Matthew Brost <matthew.brost@intel.com> Link: https://lore.kernel.org/r/20250826182911.392550-2-stuart.summers@intel.com
1 parent 2674f1e commit ce5059b

2 files changed

Lines changed: 15 additions & 6 deletions

File tree

drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,20 @@ static void xe_gt_tlb_fence_timeout(struct work_struct *work)
118118
*/
119119
int xe_gt_tlb_invalidation_init_early(struct xe_gt *gt)
120120
{
121+
struct xe_device *xe = gt_to_xe(gt);
122+
int err;
123+
121124
gt->tlb_invalidation.seqno = 1;
122125
INIT_LIST_HEAD(&gt->tlb_invalidation.pending_fences);
123126
spin_lock_init(&gt->tlb_invalidation.pending_lock);
124127
spin_lock_init(&gt->tlb_invalidation.lock);
125128
INIT_DELAYED_WORK(&gt->tlb_invalidation.fence_tdr,
126129
xe_gt_tlb_fence_timeout);
127130

131+
err = drmm_mutex_init(&xe->drm, &gt->tlb_invalidation.seqno_lock);
132+
if (err)
133+
return err;
134+
128135
gt->tlb_invalidation.job_wq =
129136
drmm_alloc_ordered_workqueue(&gt_to_xe(gt)->drm, "gt-tbl-inval-job-wq",
130137
WQ_MEM_RECLAIM);
@@ -158,7 +165,7 @@ void xe_gt_tlb_invalidation_reset(struct xe_gt *gt)
158165
* appear.
159166
*/
160167

161-
mutex_lock(&gt->uc.guc.ct.lock);
168+
mutex_lock(&gt->tlb_invalidation.seqno_lock);
162169
spin_lock_irq(&gt->tlb_invalidation.pending_lock);
163170
cancel_delayed_work(&gt->tlb_invalidation.fence_tdr);
164171
/*
@@ -178,7 +185,7 @@ void xe_gt_tlb_invalidation_reset(struct xe_gt *gt)
178185
&gt->tlb_invalidation.pending_fences, link)
179186
invalidation_fence_signal(gt_to_xe(gt), fence);
180187
spin_unlock_irq(&gt->tlb_invalidation.pending_lock);
181-
mutex_unlock(&gt->uc.guc.ct.lock);
188+
mutex_unlock(&gt->tlb_invalidation.seqno_lock);
182189
}
183190

184191
static bool tlb_invalidation_seqno_past(struct xe_gt *gt, int seqno)
@@ -211,13 +218,13 @@ static int send_tlb_invalidation(struct xe_guc *guc,
211218
* need to be updated.
212219
*/
213220

214-
mutex_lock(&guc->ct.lock);
221+
mutex_lock(&gt->tlb_invalidation.seqno_lock);
215222
seqno = gt->tlb_invalidation.seqno;
216223
fence->seqno = seqno;
217224
trace_xe_gt_tlb_invalidation_fence_send(xe, fence);
218225
action[1] = seqno;
219-
ret = xe_guc_ct_send_locked(&guc->ct, action, len,
220-
G2H_LEN_DW_TLB_INVALIDATE, 1);
226+
ret = xe_guc_ct_send(&guc->ct, action, len,
227+
G2H_LEN_DW_TLB_INVALIDATE, 1);
221228
if (!ret) {
222229
spin_lock_irq(&gt->tlb_invalidation.pending_lock);
223230
/*
@@ -248,7 +255,7 @@ static int send_tlb_invalidation(struct xe_guc *guc,
248255
if (!gt->tlb_invalidation.seqno)
249256
gt->tlb_invalidation.seqno = 1;
250257
}
251-
mutex_unlock(&guc->ct.lock);
258+
mutex_unlock(&gt->tlb_invalidation.seqno_lock);
252259
xe_gt_stats_incr(gt, XE_GT_STATS_ID_TLB_INVAL, 1);
253260

254261
return ret;

drivers/gpu/drm/xe/xe_gt_types.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ struct xe_gt {
190190
/** @tlb_invalidation.seqno: TLB invalidation seqno, protected by CT lock */
191191
#define TLB_INVALIDATION_SEQNO_MAX 0x100000
192192
int seqno;
193+
/** @tlb_invalidation.seqno_lock: protects @tlb_invalidation.seqno */
194+
struct mutex seqno_lock;
193195
/**
194196
* @tlb_invalidation.seqno_recv: last received TLB invalidation seqno,
195197
* protected by CT lock

0 commit comments

Comments
 (0)