Skip to content

Commit aef20a9

Browse files
Tvrtko Ursulinaviallon
authored andcommitted
drm/sched: Embed run queue singleton into the scheduler
Now that the run queue to scheduler relationship is always 1:1 we can embed it (the run queue) directly in the scheduler struct and save on some allocation error handling code and such. Signed-off-by: Tvrtko Ursulin <[email protected]> Cc: Christian König <[email protected]> Cc: Danilo Krummrich <[email protected]> Cc: Matthew Brost <[email protected]> Cc: Philipp Stanner <[email protected]>
1 parent 3a13d79 commit aef20a9

File tree

12 files changed

+58
-77
lines changed

12 files changed

+58
-77
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,7 +1108,8 @@ static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p)
11081108
if (p->gang_size > 1 && !adev->vm_manager.concurrent_flush) {
11091109
for (i = 0; i < p->gang_size; ++i) {
11101110
struct drm_sched_entity *entity = p->entities[i];
1111-
struct drm_gpu_scheduler *sched = entity->rq->sched;
1111+
struct drm_gpu_scheduler *sched =
1112+
container_of(entity->rq, typeof(*sched), rq);
11121113
struct amdgpu_ring *ring = to_amdgpu_ring(sched);
11131114

11141115
if (amdgpu_vmid_uses_reserved(vm, ring->vm_hub))
@@ -1236,7 +1237,8 @@ static int amdgpu_cs_sync_rings(struct amdgpu_cs_parser *p)
12361237
return r;
12371238
}
12381239

1239-
sched = p->gang_leader->base.entity->rq->sched;
1240+
sched = container_of(p->gang_leader->base.entity->rq, typeof(*sched),
1241+
rq);
12401242
while ((fence = amdgpu_sync_get_fence(&p->sync))) {
12411243
struct drm_sched_fence *s_fence = to_drm_sched_fence(fence);
12421244

drivers/gpu/drm/amd/amdgpu/amdgpu_job.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,9 @@ static struct dma_fence *
359359
amdgpu_job_prepare_job(struct drm_sched_job *sched_job,
360360
struct drm_sched_entity *s_entity)
361361
{
362-
struct amdgpu_ring *ring = to_amdgpu_ring(s_entity->rq->sched);
362+
struct drm_gpu_scheduler *sched =
363+
container_of(s_entity->rq, typeof(*sched), rq);
364+
struct amdgpu_ring *ring = to_amdgpu_ring(sched);
363365
struct amdgpu_job *job = to_amdgpu_job(sched_job);
364366
struct dma_fence *fence;
365367
int r;
@@ -459,7 +461,7 @@ drm_sched_entity_queue_pop(struct drm_sched_entity *entity)
459461

460462
void amdgpu_job_stop_all_jobs_on_sched(struct drm_gpu_scheduler *sched)
461463
{
462-
struct drm_sched_rq *rq = sched->rq;
464+
struct drm_sched_rq *rq = &sched->rq;
463465
struct drm_sched_entity *s_entity;
464466
struct drm_sched_job *s_job;
465467

drivers/gpu/drm/amd/amdgpu/amdgpu_job.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,10 @@ struct amdgpu_job {
8585

8686
static inline struct amdgpu_ring *amdgpu_job_ring(struct amdgpu_job *job)
8787
{
88-
return to_amdgpu_ring(job->base.entity->rq->sched);
88+
struct drm_gpu_scheduler *sched =
89+
container_of(job->base.entity->rq, typeof(*sched), rq);
90+
91+
return to_amdgpu_ring(sched);
8992
}
9093

9194
int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm *vm,

drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,18 +145,22 @@ TRACE_EVENT(amdgpu_cs,
145145
struct amdgpu_ib *ib),
146146
TP_ARGS(p, job, ib),
147147
TP_STRUCT__entry(
148+
__field(struct drm_gpu_scheduler *, sched)
148149
__field(struct amdgpu_bo_list *, bo_list)
149150
__field(u32, ring)
150151
__field(u32, dw)
151152
__field(u32, fences)
152153
),
153154

154155
TP_fast_assign(
156+
__entry->sched = container_of(job->base.entity->rq,
157+
typeof(*__entry->sched),
158+
rq);
155159
__entry->bo_list = p->bo_list;
156-
__entry->ring = to_amdgpu_ring(job->base.entity->rq->sched)->idx;
160+
__entry->ring = to_amdgpu_ring(__entry->sched)->idx;
157161
__entry->dw = ib->length_dw;
158162
__entry->fences = amdgpu_fence_count_emitted(
159-
to_amdgpu_ring(job->base.entity->rq->sched));
163+
to_amdgpu_ring(__entry->sched));
160164
),
161165
TP_printk("bo_list=%p, ring=%u, dw=%u, fences=%u",
162166
__entry->bo_list, __entry->ring, __entry->dw,

drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,13 @@ static int amdgpu_vm_sdma_prepare(struct amdgpu_vm_update_params *p,
105105
static int amdgpu_vm_sdma_commit(struct amdgpu_vm_update_params *p,
106106
struct dma_fence **fence)
107107
{
108+
struct drm_gpu_scheduler *sched =
109+
container_of(p->vm->delayed.rq, typeof(*sched), rq);
110+
struct amdgpu_ring *ring =
111+
container_of(sched, struct amdgpu_ring, sched);
108112
struct amdgpu_ib *ib = p->job->ibs;
109-
struct amdgpu_ring *ring;
110113
struct dma_fence *f;
111114

112-
ring = container_of(p->vm->delayed.rq->sched, struct amdgpu_ring,
113-
sched);
114-
115115
WARN_ON(ib->length_dw == 0);
116116
amdgpu_ring_pad_ib(ring, ib);
117117

drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -420,15 +420,15 @@ int amdgpu_xcp_open_device(struct amdgpu_device *adev,
420420
void amdgpu_xcp_release_sched(struct amdgpu_device *adev,
421421
struct amdgpu_ctx_entity *entity)
422422
{
423-
struct drm_gpu_scheduler *sched;
424-
struct amdgpu_ring *ring;
423+
struct drm_gpu_scheduler *sched =
424+
container_of(entity->entity.rq, typeof(*sched), rq);
425425

426426
if (!adev->xcp_mgr)
427427
return;
428428

429-
sched = entity->entity.rq->sched;
430429
if (drm_sched_wqueue_ready(sched)) {
431-
ring = to_amdgpu_ring(entity->entity.rq->sched);
430+
struct amdgpu_ring *ring = to_amdgpu_ring(sched);
431+
432432
atomic_dec(&adev->xcp_mgr->xcp[ring->xcp_id].ref_cnt);
433433
}
434434
}

drivers/gpu/drm/scheduler/sched_entity.c

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -104,19 +104,12 @@ int drm_sched_entity_init(struct drm_sched_entity *entity,
104104
* is initialized itself.
105105
*/
106106
entity->sched_list = num_sched_list > 1 ? sched_list : NULL;
107+
if (num_sched_list) {
108+
entity->sched_list = num_sched_list > 1 ? sched_list : NULL;
109+
entity->rq = &sched_list[0]->rq;
110+
}
107111
RCU_INIT_POINTER(entity->last_scheduled, NULL);
108112
RB_CLEAR_NODE(&entity->rb_tree_node);
109-
110-
if (num_sched_list && !sched_list[0]->rq) {
111-
/* Since every entry covered by num_sched_list
112-
* should be non-NULL and therefore we warn drivers
113-
* not to do this and to fix their DRM calling order.
114-
*/
115-
pr_warn("%s: called with uninitialized scheduler\n", __func__);
116-
} else if (num_sched_list) {
117-
entity->rq = sched_list[0]->rq;
118-
}
119-
120113
init_completion(&entity->entity_idle);
121114

122115
/* We start in an idle state. */
@@ -302,7 +295,7 @@ long drm_sched_entity_flush(struct drm_sched_entity *entity, long timeout)
302295
if (!entity->rq)
303296
return 0;
304297

305-
sched = entity->rq->sched;
298+
sched = container_of(entity->rq, typeof(*sched), rq);
306299
/**
307300
* The client will not queue more IBs during this fini, consume existing
308301
* queued IBs or discard them on SIGKILL
@@ -394,9 +387,11 @@ static void drm_sched_entity_wakeup(struct dma_fence *f,
394387
{
395388
struct drm_sched_entity *entity =
396389
container_of(cb, struct drm_sched_entity, cb);
390+
struct drm_gpu_scheduler *sched =
391+
container_of(entity->rq, typeof(*sched), rq);
397392

398393
drm_sched_entity_clear_dep(f, cb);
399-
drm_sched_wakeup(entity->rq->sched);
394+
drm_sched_wakeup(sched);
400395
}
401396

402397
/**
@@ -422,7 +417,8 @@ EXPORT_SYMBOL(drm_sched_entity_set_priority);
422417
*/
423418
static bool drm_sched_entity_add_dependency_cb(struct drm_sched_entity *entity)
424419
{
425-
struct drm_gpu_scheduler *sched = entity->rq->sched;
420+
struct drm_gpu_scheduler *sched =
421+
container_of(entity->rq, typeof(*sched), rq);
426422
struct dma_fence *fence = entity->dependency;
427423
struct drm_sched_fence *s_fence;
428424

@@ -561,7 +557,7 @@ void drm_sched_entity_select_rq(struct drm_sched_entity *entity)
561557

562558
spin_lock(&entity->lock);
563559
sched = drm_sched_pick_best(entity->sched_list, entity->num_sched_list);
564-
rq = sched ? sched->rq : NULL;
560+
rq = sched ? &sched->rq : NULL;
565561
if (rq != entity->rq) {
566562
drm_sched_rq_remove_entity(entity->rq, entity);
567563
entity->rq = rq;
@@ -584,10 +580,12 @@ void drm_sched_entity_select_rq(struct drm_sched_entity *entity)
584580
void drm_sched_entity_push_job(struct drm_sched_job *sched_job)
585581
{
586582
struct drm_sched_entity *entity = sched_job->entity;
583+
struct drm_gpu_scheduler *sched =
584+
container_of(entity->rq, typeof(*sched), rq);
587585
bool first;
588586

589587
trace_drm_sched_job(sched_job, entity);
590-
atomic_inc(entity->rq->sched->score);
588+
atomic_inc(sched->score);
591589
WRITE_ONCE(entity->last_user, current->group_leader);
592590

593591
/*
@@ -598,8 +596,6 @@ void drm_sched_entity_push_job(struct drm_sched_job *sched_job)
598596

599597
/* first job wakes up scheduler */
600598
if (first) {
601-
struct drm_gpu_scheduler *sched;
602-
603599
sched = drm_sched_rq_add_entity(entity);
604600
if (sched)
605601
drm_sched_wakeup(sched);

drivers/gpu/drm/scheduler/sched_fence.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ void drm_sched_fence_init(struct drm_sched_fence *fence,
225225
{
226226
unsigned seq;
227227

228-
fence->sched = entity->rq->sched;
228+
fence->sched = container_of(entity->rq, typeof(*fence->sched), rq);
229229
seq = atomic_inc_return(&entity->fence_seq);
230230
dma_fence_init(&fence->scheduled, &drm_sched_fence_ops_scheduled,
231231
&fence->lock, entity->fence_context, seq);

drivers/gpu/drm/scheduler/sched_internal.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,9 @@ struct drm_sched_entity_stats {
1717

1818
void drm_sched_wakeup(struct drm_gpu_scheduler *sched);
1919

20-
void drm_sched_rq_init(struct drm_gpu_scheduler *sched,
21-
struct drm_sched_rq *rq);
20+
void drm_sched_rq_init(struct drm_gpu_scheduler *sched);
2221
struct drm_sched_entity *
23-
drm_sched_rq_select_entity(struct drm_gpu_scheduler *sched,
24-
struct drm_sched_rq *rq);
22+
drm_sched_rq_select_entity(struct drm_gpu_scheduler *sched);
2523
struct drm_gpu_scheduler *
2624
drm_sched_rq_add_entity(struct drm_sched_entity *entity);
2725
void drm_sched_rq_remove_entity(struct drm_sched_rq *rq,

drivers/gpu/drm/scheduler/sched_main.c

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ void drm_sched_job_arm(struct drm_sched_job *job)
572572

573573
BUG_ON(!entity);
574574
drm_sched_entity_select_rq(entity);
575-
sched = entity->rq->sched;
575+
sched = container_of(entity->rq, typeof(*sched), rq);
576576

577577
job->sched = sched;
578578
job->s_priority = entity->priority;
@@ -912,7 +912,7 @@ static void drm_sched_run_job_work(struct work_struct *w)
912912

913913
while (!READ_ONCE(sched->pause_submit)) {
914914
/* Find entity with a ready job */
915-
entity = drm_sched_rq_select_entity(sched, sched->rq);
915+
entity = drm_sched_rq_select_entity(sched);
916916
if (!entity)
917917
break; /* No more work */
918918

@@ -1010,15 +1010,6 @@ int drm_sched_init(struct drm_gpu_scheduler *sched, const struct drm_sched_init_
10101010
sched->score = args->score ? args->score : &sched->_score;
10111011
sched->dev = args->dev;
10121012

1013-
if (sched->rq) {
1014-
/* Not an error, but warn anyway so drivers can
1015-
* fine-tune their DRM calling order, and return all
1016-
* is good.
1017-
*/
1018-
dev_warn(sched->dev, "%s: scheduler already initialized!\n", __func__);
1019-
return 0;
1020-
}
1021-
10221013
if (args->submit_wq) {
10231014
sched->submit_wq = args->submit_wq;
10241015
sched->own_submit_wq = false;
@@ -1030,11 +1021,7 @@ int drm_sched_init(struct drm_gpu_scheduler *sched, const struct drm_sched_init_
10301021
sched->own_submit_wq = true;
10311022
}
10321023

1033-
sched->rq = kmalloc(sizeof(*sched->rq), GFP_KERNEL | __GFP_ZERO);
1034-
if (!sched->rq)
1035-
goto Out_check_own;
1036-
1037-
drm_sched_rq_init(sched, sched->rq);
1024+
drm_sched_rq_init(sched);
10381025

10391026
init_waitqueue_head(&sched->job_scheduled);
10401027
INIT_LIST_HEAD(&sched->pending_list);
@@ -1049,12 +1036,6 @@ int drm_sched_init(struct drm_gpu_scheduler *sched, const struct drm_sched_init_
10491036

10501037
sched->ready = true;
10511038
return 0;
1052-
1053-
Out_check_own:
1054-
if (sched->own_submit_wq)
1055-
destroy_workqueue(sched->submit_wq);
1056-
dev_err(sched->dev, "%s: Failed to setup GPU scheduler--out of memory\n", __func__);
1057-
return -ENOMEM;
10581039
}
10591040
EXPORT_SYMBOL(drm_sched_init);
10601041

@@ -1082,7 +1063,7 @@ EXPORT_SYMBOL(drm_sched_init);
10821063
void drm_sched_fini(struct drm_gpu_scheduler *sched)
10831064
{
10841065

1085-
struct drm_sched_rq *rq = sched->rq;
1066+
struct drm_sched_rq *rq = &sched->rq;
10861067
struct drm_sched_entity *s_entity;
10871068

10881069
drm_sched_wqueue_stop(sched);
@@ -1106,8 +1087,6 @@ void drm_sched_fini(struct drm_gpu_scheduler *sched)
11061087
if (sched->own_submit_wq)
11071088
destroy_workqueue(sched->submit_wq);
11081089
sched->ready = false;
1109-
kfree(sched->rq);
1110-
sched->rq = NULL;
11111090
}
11121091
EXPORT_SYMBOL(drm_sched_fini);
11131092

@@ -1124,7 +1103,7 @@ void drm_sched_increase_karma(struct drm_sched_job *bad)
11241103
{
11251104
struct drm_gpu_scheduler *sched = bad->sched;
11261105
struct drm_sched_entity *entity, *tmp;
1127-
struct drm_sched_rq *rq = sched->rq;
1106+
struct drm_sched_rq *rq = &sched->rq;
11281107

11291108
/* don't change @bad's karma if it's from KERNEL RQ,
11301109
* because sometimes GPU hang would cause kernel jobs (like VM updating jobs)

0 commit comments

Comments
 (0)