<div dir="auto">Yes, that is correct. <div dir="auto"><br></div><div dir="auto">Nayan</div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Aug 1, 2018, 9:05 PM Andrey Grodzovsky <<a href="mailto:Andrey.Grodzovsky@amd.com">Andrey.Grodzovsky@amd.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Clarification question -  if the run queues belong to different <br>
schedulers they effectively point to different rings,<br>
<br>
it means we allow to move (reschedule) a drm_sched_entity from one ring <br>
to another - i assume that the idea int the first place, that<br>
<br>
you have a set of HW rings and you can utilize any of them for your jobs <br>
(like compute rings). Correct ?<br>
<br>
Andrey<br>
<br>
<br>
On 08/01/2018 04:20 AM, Nayan Deshmukh wrote:<br>
> The function selects the run queue from the rq_list with the<br>
> least load. The load is decided by the number of jobs in a<br>
> scheduler.<br>
><br>
> v2: avoid using atomic read twice consecutively, instead store<br>
>      it locally<br>
><br>
> Signed-off-by: Nayan Deshmukh <<a href="mailto:nayan26deshmukh@gmail.com" target="_blank" rel="noreferrer">nayan26deshmukh@gmail.com</a>><br>
> ---<br>
>   drivers/gpu/drm/scheduler/gpu_scheduler.c | 25 +++++++++++++++++++++++++<br>
>   1 file changed, 25 insertions(+)<br>
><br>
> diff --git a/drivers/gpu/drm/scheduler/gpu_scheduler.c b/drivers/gpu/drm/scheduler/gpu_scheduler.c<br>
> index 375f6f7f6a93..fb4e542660b0 100644<br>
> --- a/drivers/gpu/drm/scheduler/gpu_scheduler.c<br>
> +++ b/drivers/gpu/drm/scheduler/gpu_scheduler.c<br>
> @@ -255,6 +255,31 @@ static bool drm_sched_entity_is_ready(struct drm_sched_entity *entity)<br>
>       return true;<br>
>   }<br>
>   <br>
> +/**<br>
> + * drm_sched_entity_get_free_sched - Get the rq from rq_list with least load<br>
> + *<br>
> + * @entity: scheduler entity<br>
> + *<br>
> + * Return the pointer to the rq with least load.<br>
> + */<br>
> +static struct drm_sched_rq *<br>
> +drm_sched_entity_get_free_sched(struct drm_sched_entity *entity)<br>
> +{<br>
> +     struct drm_sched_rq *rq = NULL;<br>
> +     unsigned int min_jobs = UINT_MAX, num_jobs;<br>
> +     int i;<br>
> +<br>
> +     for (i = 0; i < entity->num_rq_list; ++i) {<br>
> +             num_jobs = atomic_read(&entity->rq_list[i]->sched->num_jobs);<br>
> +             if (num_jobs < min_jobs) {<br>
> +                     min_jobs = num_jobs;<br>
> +                     rq = entity->rq_list[i];<br>
> +             }<br>
> +     }<br>
> +<br>
> +     return rq;<br>
> +}<br>
> +<br>
>   static void drm_sched_entity_kill_jobs_cb(struct dma_fence *f,<br>
>                                   struct dma_fence_cb *cb)<br>
>   {<br>
<br>
</blockquote></div>