On Mon, Oct 22, 2018 at 9:46 PM Koenig, Christian <Christian.Koenig@xxxxxxx> wrote: > > Am 18.10.18 um 17:37 schrieb : > > If the hardware queue for a scheduler is empty then we don't > > need to the shift the entities from their current scheduler > > as they are not getting scheduled because of some dependency. > > That is most likely not a good idea. The scheduler might not have > anything todo right now, but we can't guarantee that it will stay this way. > I agree. But conversely it might also happens that one hardware engine is sitting idle until the runqueue of the other schedulers comes to the level of this scheduler. I think the best option is to pick the scheduler with empty hardware queue when the difference in their software queues is less that MAX_DIFF. The problem is that determining the optimal value of MAX_DIFF is not all that easy. For now it's better to use MAX_DIFF=0 as you suggested until we can find a way to determine its value. Regards, Nayan > Instead when the number of jobs on a rq is identical we should select > the one with the least entities on it. > > This should make sure that we distribute the entities equally among the > runqueues even when they are idle. > > Christian. > > > > > Signed-off-by: Nayan Deshmukh <nayan26deshmukh@xxxxxxxxx> > > --- > > drivers/gpu/drm/scheduler/sched_entity.c | 14 ++++++++++++++ > > 1 file changed, 14 insertions(+) > > > > diff --git a/drivers/gpu/drm/scheduler/sched_entity.c b/drivers/gpu/drm/scheduler/sched_entity.c > > index 3e22a54a99c2..4d18497d6ecf 100644 > > --- a/drivers/gpu/drm/scheduler/sched_entity.c > > +++ b/drivers/gpu/drm/scheduler/sched_entity.c > > @@ -130,6 +130,12 @@ drm_sched_entity_get_free_sched(struct drm_sched_entity *entity) > > int i; > > > > for (i = 0; i < entity->num_rq_list; ++i) { > > + if (atomic_read(&entity->rq_list[i]->sched->hw_rq_count) < > > + entity->rq_list[i]->sched->hw_submission_limit) { > > + rq = entity->rq_list[i]; > > + break; > > + } > > + > > num_jobs = atomic_read(&entity->rq_list[i]->sched->num_jobs); > > if (num_jobs < min_jobs) { > > min_jobs = num_jobs; > > @@ -470,6 +476,14 @@ void drm_sched_entity_select_rq(struct drm_sched_entity *entity) > > if (spsc_queue_count(&entity->job_queue) || entity->num_rq_list <= 1) > > return; > > > > + /* > > + * We don't need to shift entity if the hardware > > + * queue of current scheduler is empty > > + */ > > + if (atomic_read(&entity->rq->sched->hw_rq_count) < > > + entity->rq->sched->hw_submission_limit) > > + return; > > + > > fence = READ_ONCE(entity->last_scheduled); > > if (fence && !dma_fence_is_signaled(fence)) > > return; > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel