[PATCH 2/2] drm/sched: Reverse run-queue priority enumeration
Christian König
christian.koenig at amd.com
Fri Nov 24 08:04:04 UTC 2023
Am 24.11.23 um 06:27 schrieb Luben Tuikov:
> Reverse run-queue priority enumeration such that the higest priority is now 0,
> and for each consecutive integer the prioirty diminishes.
>
> Run-queues correspond to priorities. To an external observer a scheduler
> created with a single run-queue, and another created with
> DRM_SCHED_PRIORITY_COUNT number of run-queues, should always schedule
> sched->sched_rq[0] with the same "priority", as that index run-queue exists in
> both schedulers, i.e. a scheduler with one run-queue or many. This patch makes
> it so.
>
> In other words, the "priority" of sched->sched_rq[n], n >= 0, is the same for
> any scheduler created with any allowable number of run-queues (priorities), 0
> to DRM_SCHED_PRIORITY_COUNT.
>
> Cc: Rob Clark <robdclark at gmail.com>
> Cc: Abhinav Kumar <quic_abhinavk at quicinc.com>
> Cc: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
> Cc: Danilo Krummrich <dakr at redhat.com>
> Cc: Alex Deucher <alexander.deucher at amd.com>
> Cc: Christian König <christian.koenig at amd.com>
> Cc: linux-arm-msm at vger.kernel.org
> Cc: freedreno at lists.freedesktop.org
> Cc: dri-devel at lists.freedesktop.org
> Signed-off-by: Luben Tuikov <ltuikov89 at gmail.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 2 +-
> drivers/gpu/drm/msm/msm_gpu.h | 2 +-
> drivers/gpu/drm/scheduler/sched_entity.c | 7 ++++---
> drivers/gpu/drm/scheduler/sched_main.c | 15 +++++++--------
> include/drm/gpu_scheduler.h | 6 +++---
> 5 files changed, 16 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> index 1a25931607c514..71a5cf37b472d4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> @@ -325,7 +325,7 @@ void amdgpu_job_stop_all_jobs_on_sched(struct drm_gpu_scheduler *sched)
> int i;
>
> /* Signal all jobs not yet scheduled */
> - for (i = sched->num_rqs - 1; i >= DRM_SCHED_PRIORITY_LOW; i--) {
> + for (i = DRM_SCHED_PRIORITY_KERNEL; i < sched->num_rqs; i++) {
> struct drm_sched_rq *rq = sched->sched_rq[i];
> spin_lock(&rq->lock);
> list_for_each_entry(s_entity, &rq->entities, list) {
> diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h
> index eb0c97433e5f8a..2bfcb222e35338 100644
> --- a/drivers/gpu/drm/msm/msm_gpu.h
> +++ b/drivers/gpu/drm/msm/msm_gpu.h
> @@ -347,7 +347,7 @@ struct msm_gpu_perfcntr {
> * DRM_SCHED_PRIORITY_KERNEL priority level is treated specially in some
> * cases, so we don't use it (no need for kernel generated jobs).
> */
> -#define NR_SCHED_PRIORITIES (1 + DRM_SCHED_PRIORITY_HIGH - DRM_SCHED_PRIORITY_LOW)
> +#define NR_SCHED_PRIORITIES (1 + DRM_SCHED_PRIORITY_LOW - DRM_SCHED_PRIORITY_HIGH)
>
> /**
> * struct msm_file_private - per-drm_file context
> diff --git a/drivers/gpu/drm/scheduler/sched_entity.c b/drivers/gpu/drm/scheduler/sched_entity.c
> index cb7445be3cbb4e..6e2b02e45e3a32 100644
> --- a/drivers/gpu/drm/scheduler/sched_entity.c
> +++ b/drivers/gpu/drm/scheduler/sched_entity.c
> @@ -81,14 +81,15 @@ int drm_sched_entity_init(struct drm_sched_entity *entity,
> */
> 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.
> + /* The "priority" of an entity cannot exceed the number of
> + * run-queues of a scheduler. Choose the lowest priority
> + * available.
> */
> if (entity->priority >= sched_list[0]->num_rqs) {
> drm_err(sched_list[0], "entity with out-of-bounds priority:%u num_rqs:%u\n",
> entity->priority, sched_list[0]->num_rqs);
> entity->priority = max_t(s32, (s32) sched_list[0]->num_rqs - 1,
> - (s32) DRM_SCHED_PRIORITY_LOW);
> + (s32) DRM_SCHED_PRIORITY_KERNEL);
That seems to be a no-op. You basically say max_T(.., num_rqs - 1, 0),
this will always be num_rqs - 1
Apart from that looks good to me.
Christian.
> }
> entity->rq = sched_list[0]->sched_rq[entity->priority];
> }
> diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
> index b6d7bc49ff6ef4..682aebe96db781 100644
> --- a/drivers/gpu/drm/scheduler/sched_main.c
> +++ b/drivers/gpu/drm/scheduler/sched_main.c
> @@ -1051,8 +1051,9 @@ drm_sched_select_entity(struct drm_gpu_scheduler *sched)
> struct drm_sched_entity *entity;
> int i;
>
> - /* Kernel run queue has higher priority than normal run queue*/
> - for (i = sched->num_rqs - 1; i >= DRM_SCHED_PRIORITY_LOW; i--) {
> + /* Start with the highest priority.
> + */
> + for (i = DRM_SCHED_PRIORITY_KERNEL; i < sched->num_rqs; i++) {
> entity = drm_sched_policy == DRM_SCHED_POLICY_FIFO ?
> drm_sched_rq_select_entity_fifo(sched, sched->sched_rq[i]) :
> drm_sched_rq_select_entity_rr(sched, sched->sched_rq[i]);
> @@ -1291,7 +1292,7 @@ int drm_sched_init(struct drm_gpu_scheduler *sched,
> if (!sched->sched_rq)
> goto Out_free;
> sched->num_rqs = num_rqs;
> - for (i = DRM_SCHED_PRIORITY_LOW; i < sched->num_rqs; i++) {
> + for (i = DRM_SCHED_PRIORITY_KERNEL; i < sched->num_rqs; i++) {
> sched->sched_rq[i] = kzalloc(sizeof(*sched->sched_rq[i]), GFP_KERNEL);
> if (!sched->sched_rq[i])
> goto Out_unroll;
> @@ -1312,7 +1313,7 @@ int drm_sched_init(struct drm_gpu_scheduler *sched,
> sched->ready = true;
> return 0;
> Out_unroll:
> - for (--i ; i >= DRM_SCHED_PRIORITY_LOW; i--)
> + for (--i ; i >= DRM_SCHED_PRIORITY_KERNEL; i--)
> kfree(sched->sched_rq[i]);
> Out_free:
> kfree(sched->sched_rq);
> @@ -1338,7 +1339,7 @@ void drm_sched_fini(struct drm_gpu_scheduler *sched)
>
> drm_sched_wqueue_stop(sched);
>
> - for (i = sched->num_rqs - 1; i >= DRM_SCHED_PRIORITY_LOW; i--) {
> + for (i = DRM_SCHED_PRIORITY_KERNEL; i < sched->num_rqs; i++) {
> struct drm_sched_rq *rq = sched->sched_rq[i];
>
> spin_lock(&rq->lock);
> @@ -1390,9 +1391,7 @@ void drm_sched_increase_karma(struct drm_sched_job *bad)
> if (bad->s_priority != DRM_SCHED_PRIORITY_KERNEL) {
> atomic_inc(&bad->karma);
>
> - for (i = DRM_SCHED_PRIORITY_LOW;
> - i < min_t(typeof(sched->num_rqs), sched->num_rqs, DRM_SCHED_PRIORITY_KERNEL);
> - i++) {
> + for (i = DRM_SCHED_PRIORITY_HIGH; i < sched->num_rqs; i++) {
> struct drm_sched_rq *rq = sched->sched_rq[i];
>
> spin_lock(&rq->lock);
> diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h
> index d8e2d84d9223e3..5acc64954a8830 100644
> --- a/include/drm/gpu_scheduler.h
> +++ b/include/drm/gpu_scheduler.h
> @@ -63,10 +63,10 @@ struct drm_file;
> * to an array, and as such should start at 0.
> */
> enum drm_sched_priority {
> - DRM_SCHED_PRIORITY_LOW,
> - DRM_SCHED_PRIORITY_NORMAL,
> - DRM_SCHED_PRIORITY_HIGH,
> DRM_SCHED_PRIORITY_KERNEL,
> + DRM_SCHED_PRIORITY_HIGH,
> + DRM_SCHED_PRIORITY_NORMAL,
> + DRM_SCHED_PRIORITY_LOW,
>
> DRM_SCHED_PRIORITY_COUNT
> };
More information about the dri-devel
mailing list