@@ -475,7 +475,7 @@ void drm_sched_entity_select_rq(struct drm_sched_entity *entity)
return;
spin_lock(&entity->rq_lock);
- sched = drm_sched_pick_best(entity->sched_list, entity->num_sched_list);
+ sched = *drm_sched_pick_best(entity->sched_list, entity->num_sched_list);
rq = sched ? &sched->sched_rq[entity->priority] : NULL;
if (rq != entity->rq) {
drm_sched_rq_remove_entity(entity->rq, entity);
@@ -863,12 +863,12 @@ drm_sched_get_cleanup_job(struct drm_gpu_scheduler *sched)
* Returns pointer of the sched with the least load or NULL if none of the
* drm_gpu_schedulers are ready
*/
-struct drm_gpu_scheduler *
+struct drm_gpu_scheduler **
drm_sched_pick_best(struct drm_gpu_scheduler **sched_list,
unsigned int num_sched_list)
{
- struct drm_gpu_scheduler *sched, *picked_sched = NULL;
- int i;
+ struct drm_gpu_scheduler *sched;
+ int i, picked_idx = -1;
unsigned int min_score = UINT_MAX, num_score;
for (i = 0; i < num_sched_list; ++i) {
@@ -883,11 +883,13 @@ drm_sched_pick_best(struct drm_gpu_scheduler **sched_list,
num_score = atomic_read(sched->score);
if (num_score < min_score) {
min_score = num_score;
- picked_sched = sched;
+ picked_idx = i;
}
}
-
- return picked_sched;
+ if (picked_idx != -1)
+ return &(sched_list[picked_idx]);
+ else
+ return (struct drm_gpu_scheduler **)(NULL);
}
EXPORT_SYMBOL(drm_sched_pick_best);
drm_sched_pick_best return best selecetd ring schedul list's address. Signed-off-by: James Zhu <James.Zhu@amd.com> --- drivers/gpu/drm/scheduler/sched_entity.c | 2 +- drivers/gpu/drm/scheduler/sched_main.c | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-)