Skip to content

Commit a839e36

Browse files
mbrost05rodrigovivi
authored andcommitted
drm/xe: Use pool of ordered wq for GuC submission
To appease lockdep, use a pool of ordered wq for GuC submission rather tha leaving the ordered wq allocation to the drm sched. Without this change eventually lockdep runs out of hash entries (MAX_LOCKDEP_CHAINS is exceeded) as each user allocated exec queue adds more hash table entries to lockdep. A pool old of 256 ordered wq should be enough to have similar behavior with and without lockdep enabled. Signed-off-by: Matthew Brost <matthew.brost@intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
1 parent 43efd3b commit a839e36

File tree

2 files changed

+71
-4
lines changed

2 files changed

+71
-4
lines changed

drivers/gpu/drm/xe/xe_guc_submit.c

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,13 +188,66 @@ static bool exec_queue_killed_or_banned(struct xe_exec_queue *q)
188188
return exec_queue_killed(q) || exec_queue_banned(q);
189189
}
190190

191+
#ifdef CONFIG_PROVE_LOCKING
192+
static int alloc_submit_wq(struct xe_guc *guc)
193+
{
194+
int i;
195+
196+
for (i = 0; i < NUM_SUBMIT_WQ; ++i) {
197+
guc->submission_state.submit_wq_pool[i] =
198+
alloc_ordered_workqueue("submit_wq", 0);
199+
if (!guc->submission_state.submit_wq_pool[i])
200+
goto err_free;
201+
}
202+
203+
return 0;
204+
205+
err_free:
206+
while (i)
207+
destroy_workqueue(guc->submission_state.submit_wq_pool[--i]);
208+
209+
return -ENOMEM;
210+
}
211+
212+
static void free_submit_wq(struct xe_guc *guc)
213+
{
214+
int i;
215+
216+
for (i = 0; i < NUM_SUBMIT_WQ; ++i)
217+
destroy_workqueue(guc->submission_state.submit_wq_pool[i]);
218+
}
219+
220+
static struct workqueue_struct *get_submit_wq(struct xe_guc *guc)
221+
{
222+
int idx = guc->submission_state.submit_wq_idx++ % NUM_SUBMIT_WQ;
223+
224+
return guc->submission_state.submit_wq_pool[idx];
225+
}
226+
#else
227+
static int alloc_submit_wq(struct xe_guc *guc)
228+
{
229+
return 0;
230+
}
231+
232+
static void free_submit_wq(struct xe_guc *guc)
233+
{
234+
235+
}
236+
237+
static struct workqueue_struct *get_submit_wq(struct xe_guc *guc)
238+
{
239+
return NULL;
240+
}
241+
#endif
242+
191243
static void guc_submit_fini(struct drm_device *drm, void *arg)
192244
{
193245
struct xe_guc *guc = arg;
194246

195247
xa_destroy(&guc->submission_state.exec_queue_lookup);
196248
ida_destroy(&guc->submission_state.guc_ids);
197249
bitmap_free(guc->submission_state.guc_ids_bitmap);
250+
free_submit_wq(guc);
198251
mutex_destroy(&guc->submission_state.lock);
199252
}
200253

@@ -230,6 +283,12 @@ int xe_guc_submit_init(struct xe_guc *guc)
230283
if (!guc->submission_state.guc_ids_bitmap)
231284
return -ENOMEM;
232285

286+
err = alloc_submit_wq(guc);
287+
if (err) {
288+
bitmap_free(guc->submission_state.guc_ids_bitmap);
289+
return err;
290+
}
291+
233292
gt->exec_queue_ops = &guc_exec_queue_ops;
234293

235294
mutex_init(&guc->submission_state.lock);
@@ -1166,10 +1225,11 @@ static int guc_exec_queue_init(struct xe_exec_queue *q)
11661225

11671226
timeout = (q->vm && xe_vm_no_dma_fences(q->vm)) ? MAX_SCHEDULE_TIMEOUT :
11681227
q->hwe->eclass->sched_props.job_timeout_ms;
1169-
err = xe_sched_init(&ge->sched, &drm_sched_ops, &xe_sched_ops, NULL,
1170-
q->lrc[0].ring.size / MAX_JOB_SIZE_BYTES,
1171-
64, timeout, guc_to_gt(guc)->ordered_wq, NULL,
1172-
q->name, gt_to_xe(q->gt)->drm.dev);
1228+
err = xe_sched_init(&ge->sched, &drm_sched_ops, &xe_sched_ops,
1229+
get_submit_wq(guc),
1230+
q->lrc[0].ring.size / MAX_JOB_SIZE_BYTES, 64,
1231+
timeout, guc_to_gt(guc)->ordered_wq, NULL,
1232+
q->name, gt_to_xe(q->gt)->drm.dev);
11731233
if (err)
11741234
goto err_free;
11751235

drivers/gpu/drm/xe/xe_guc_types.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ struct xe_guc {
6161
/** @patch: patch version of GuC submission */
6262
u32 patch;
6363
} version;
64+
#ifdef CONFIG_PROVE_LOCKING
65+
#define NUM_SUBMIT_WQ 256
66+
/** @submit_wq_pool: submission ordered workqueues pool */
67+
struct workqueue_struct *submit_wq_pool[NUM_SUBMIT_WQ];
68+
/** @submit_wq_idx: submission ordered workqueue index */
69+
int submit_wq_idx;
70+
#endif
6471
/** @enabled: submission is enabled */
6572
bool enabled;
6673
} submission_state;

0 commit comments

Comments
 (0)