<div dir="ltr">I will take care of that in v2.<br></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Jul 31, 2018 at 4:57 PM Christian König <<a href="mailto:ckoenig.leichtzumerken@gmail.com">ckoenig.leichtzumerken@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Am 31.07.2018 um 12:37 schrieb Nayan Deshmukh:<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>
> Signed-off-by: Nayan Deshmukh <<a href="mailto:nayan26deshmukh@gmail.com" target="_blank">nayan26deshmukh@gmail.com</a>><br>
> ---<br>
>   drivers/gpu/drm/scheduler/gpu_scheduler.c | 26 ++++++++++++++++++++++++++<br>
>   1 file changed, 26 insertions(+)<br>
><br>
> diff --git a/drivers/gpu/drm/scheduler/gpu_scheduler.c b/drivers/gpu/drm/scheduler/gpu_scheduler.c<br>
> index 375f6f7f6a93..c67f65ad8f15 100644<br>
> --- a/drivers/gpu/drm/scheduler/gpu_scheduler.c<br>
> +++ b/drivers/gpu/drm/scheduler/gpu_scheduler.c<br>
> @@ -255,6 +255,32 @@ 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;<br>
> +     int i;<br>
> +<br>
> +     for (i = 0; i < entity->num_rq_list; ++i) {<br>
> +             if (atomic_read(&entity->rq_list[i]->sched->num_jobs) <<br>
> +                             min_jobs) {<br>
> +                     min_jobs = atomic_read(<br>
> +                                     &entity->rq_list[i]->sched->num_jobs);<br>
<br>
When you use atomic_read twice you might get different results because <br>
the atomic has changed in the meantime.<br>
<br>
In other words you need to store the result locally:<br>
<br>
unsigned int num_jobs = atomic_read(....);<br>
<br>
if (num_jobs < min_jobs) {<br>
     min_jobs = num_jobs;<br>
     .....<br>
<br>
Christian.<br>
<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>