]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - drivers/gpu/drm/scheduler/sched_entity.c
drm/sched: Convert the GPU scheduler to variable number of run-queues
[thirdparty/linux.git] / drivers / gpu / drm / scheduler / sched_entity.c
index a42763e1429dc16ea653e62023174348e0002b5a..409e4256f6e7d6d5bffe68298d94df73fffecc65 100644 (file)
@@ -75,8 +75,20 @@ int drm_sched_entity_init(struct drm_sched_entity *entity,
        RCU_INIT_POINTER(entity->last_scheduled, NULL);
        RB_CLEAR_NODE(&entity->rb_tree_node);
 
-       if(num_sched_list)
-               entity->rq = &sched_list[0]->sched_rq[entity->priority];
+       if (!sched_list[0]->sched_rq) {
+               /* Warn drivers not to do this and to fix their DRM
+                * calling order.
+                */
+               pr_warn("%s: called with uninitialized scheduler\n", __func__);
+       } else if (num_sched_list) {
+               /* The "priority" of an entity cannot exceed the number
+                * of run-queues of a scheduler.
+                */
+               if (entity->priority >= sched_list[0]->num_rqs)
+                       entity->priority = max_t(u32, sched_list[0]->num_rqs,
+                                                DRM_SCHED_PRIORITY_MIN);
+               entity->rq = sched_list[0]->sched_rq[entity->priority];
+       }
 
        init_completion(&entity->entity_idle);
 
@@ -533,7 +545,7 @@ void drm_sched_entity_select_rq(struct drm_sched_entity *entity)
 
        spin_lock(&entity->rq_lock);
        sched = drm_sched_pick_best(entity->sched_list, entity->num_sched_list);
-       rq = sched ? &sched->sched_rq[entity->priority] : NULL;
+       rq = sched ? sched->sched_rq[entity->priority] : NULL;
        if (rq != entity->rq) {
                drm_sched_rq_remove_entity(entity->rq, entity);
                entity->rq = rq;