diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0032-drm-scheduler-fix-setting-the-priorty-for-entities-v.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0032-drm-scheduler-fix-setting-the-priorty-for-entities-v.patch | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0032-drm-scheduler-fix-setting-the-priorty-for-entities-v.patch b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0032-drm-scheduler-fix-setting-the-priorty-for-entities-v.patch new file mode 100644 index 00000000..320584d8 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0032-drm-scheduler-fix-setting-the-priorty-for-entities-v.patch @@ -0,0 +1,121 @@ +From d83db65ede72d48f2b9c1cd07709c6d3a70e821d Mon Sep 17 00:00:00 2001 +From: Christian Koenig <christian.koenig@amd.com> +Date: Wed, 1 Aug 2018 16:22:39 +0200 +Subject: [PATCH 0032/2940] drm/scheduler: fix setting the priorty for entities + (v2) +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Since we now deal with multiple rq we need to update all of them, not +just the current one. + +v2: Trivial: Removed unused variable (Alex) + +Signed-off-by: Christian König <christian.koenig@amd.com> +Acked-by: Nayan Deshmukh <nayan26deshmukh@gmail.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +Signed-off-by: Kalyan Alle <kalyan.alle@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 4 +-- + drivers/gpu/drm/scheduler/gpu_scheduler.c | 35 +++++++++++++++++++++++ + include/drm/gpu_scheduler.h | 4 +++ + 3 files changed, 40 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +index df6965761046..02d563cfb4a7 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +@@ -394,7 +394,6 @@ void amdgpu_ctx_priority_override(struct amdgpu_ctx *ctx, + { + int i; + struct amdgpu_device *adev = ctx->adev; +- struct drm_sched_rq *rq; + struct drm_sched_entity *entity; + struct amdgpu_ring *ring; + enum drm_sched_priority ctx_prio; +@@ -407,12 +406,11 @@ void amdgpu_ctx_priority_override(struct amdgpu_ctx *ctx, + for (i = 0; i < adev->num_rings; i++) { + ring = adev->rings[i]; + entity = &ctx->rings[i].entity; +- rq = &ring->sched.sched_rq[ctx_prio]; + + if (ring->funcs->type == AMDGPU_RING_TYPE_KIQ) + continue; + +- drm_sched_entity_set_rq(entity, rq); ++ drm_sched_entity_set_priority(entity, ctx_prio); + } + } + +diff --git a/drivers/gpu/drm/scheduler/gpu_scheduler.c b/drivers/gpu/drm/scheduler/gpu_scheduler.c +index 4fc211e19d6e..051cd8650f06 100644 +--- a/drivers/gpu/drm/scheduler/gpu_scheduler.c ++++ b/drivers/gpu/drm/scheduler/gpu_scheduler.c +@@ -382,6 +382,41 @@ static void drm_sched_entity_clear_dep(struct dma_fence *f, struct dma_fence_cb + dma_fence_put(f); + } + ++/** ++ * drm_sched_entity_set_rq_priority - helper for drm_sched_entity_set_priority ++ */ ++static void drm_sched_entity_set_rq_priority(struct drm_sched_rq **rq, ++ enum drm_sched_priority priority) ++{ ++ *rq = &(*rq)->sched->sched_rq[priority]; ++} ++ ++/** ++ * drm_sched_entity_set_priority - Sets priority of the entity ++ * ++ * @entity: scheduler entity ++ * @priority: scheduler priority ++ * ++ * Update the priority of runqueus used for the entity. ++ */ ++void drm_sched_entity_set_priority(struct drm_sched_entity *entity, ++ enum drm_sched_priority priority) ++{ ++ unsigned int i; ++ ++ spin_lock(&entity->rq_lock); ++ ++ for (i = 0; i < entity->num_rq_list; ++i) ++ drm_sched_entity_set_rq_priority(&entity->rq_list[i], priority); ++ ++ drm_sched_rq_remove_entity(entity->rq, entity); ++ drm_sched_entity_set_rq_priority(&entity->rq, priority); ++ drm_sched_rq_add_entity(entity->rq, entity); ++ ++ spin_unlock(&entity->rq_lock); ++} ++EXPORT_SYMBOL(drm_sched_entity_set_priority); ++ + /** + * drm_sched_entity_set_rq - Sets the run queue for an entity + * +diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h +index 21c648b0b2a1..14c5ccbe8bba 100644 +--- a/include/drm/gpu_scheduler.h ++++ b/include/drm/gpu_scheduler.h +@@ -75,6 +75,8 @@ enum drm_sched_priority { + struct drm_sched_entity { + struct list_head list; + struct drm_sched_rq *rq; ++ struct drm_sched_rq **rq_list; ++ unsigned int num_rq_list; + spinlock_t rq_lock; + + struct spsc_queue job_queue; +@@ -291,6 +293,8 @@ void drm_sched_entity_fini(struct drm_sched_entity *entity); + void drm_sched_entity_destroy(struct drm_sched_entity *entity); + void drm_sched_entity_push_job(struct drm_sched_job *sched_job, + struct drm_sched_entity *entity); ++void drm_sched_entity_set_priority(struct drm_sched_entity *entity, ++ enum drm_sched_priority priority); + void drm_sched_entity_set_rq(struct drm_sched_entity *entity, + struct drm_sched_rq *rq); + +-- +2.17.1 + |