drm/scheduler: fix setting the priorty for entities (v2)

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>
This commit is contained in:
Christian König 2018-08-01 16:22:39 +02:00 committed by Alex Deucher
parent bf9b1d9dc7
commit 7febe4bfd5
3 changed files with 26 additions and 19 deletions

View File

@ -394,7 +394,6 @@ void amdgpu_ctx_priority_override(struct amdgpu_ctx *ctx,
{ {
int i; int i;
struct amdgpu_device *adev = ctx->adev; struct amdgpu_device *adev = ctx->adev;
struct drm_sched_rq *rq;
struct drm_sched_entity *entity; struct drm_sched_entity *entity;
struct amdgpu_ring *ring; struct amdgpu_ring *ring;
enum drm_sched_priority ctx_prio; 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++) { for (i = 0; i < adev->num_rings; i++) {
ring = adev->rings[i]; ring = adev->rings[i];
entity = &ctx->rings[i].entity; entity = &ctx->rings[i].entity;
rq = &ring->sched.sched_rq[ctx_prio];
if (ring->funcs->type == AMDGPU_RING_TYPE_KIQ) if (ring->funcs->type == AMDGPU_RING_TYPE_KIQ)
continue; continue;
drm_sched_entity_set_rq(entity, rq); drm_sched_entity_set_priority(entity, ctx_prio);
} }
} }

View File

@ -416,29 +416,39 @@ static void drm_sched_entity_clear_dep(struct dma_fence *f, struct dma_fence_cb
} }
/** /**
* drm_sched_entity_set_rq - Sets the run queue for an entity * 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 * @entity: scheduler entity
* @rq: scheduler run queue * @priority: scheduler priority
* *
* Sets the run queue for an entity and removes the entity from the previous * Update the priority of runqueus used for the entity.
* run queue in which was present.
*/ */
void drm_sched_entity_set_rq(struct drm_sched_entity *entity, void drm_sched_entity_set_priority(struct drm_sched_entity *entity,
struct drm_sched_rq *rq) enum drm_sched_priority priority)
{ {
if (entity->rq == rq) unsigned int i;
return;
BUG_ON(!rq);
spin_lock(&entity->rq_lock); 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_rq_remove_entity(entity->rq, entity);
entity->rq = rq; drm_sched_entity_set_rq_priority(&entity->rq, priority);
drm_sched_rq_add_entity(rq, entity); drm_sched_rq_add_entity(entity->rq, entity);
spin_unlock(&entity->rq_lock); spin_unlock(&entity->rq_lock);
} }
EXPORT_SYMBOL(drm_sched_entity_set_rq); EXPORT_SYMBOL(drm_sched_entity_set_priority);
/** /**
* drm_sched_dependency_optimized * drm_sched_dependency_optimized

View File

@ -298,9 +298,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_destroy(struct drm_sched_entity *entity);
void drm_sched_entity_push_job(struct drm_sched_job *sched_job, void drm_sched_entity_push_job(struct drm_sched_job *sched_job,
struct drm_sched_entity *entity); struct drm_sched_entity *entity);
void drm_sched_entity_set_rq(struct drm_sched_entity *entity, void drm_sched_entity_set_priority(struct drm_sched_entity *entity,
struct drm_sched_rq *rq); enum drm_sched_priority priority);
struct drm_sched_fence *drm_sched_fence_create( struct drm_sched_fence *drm_sched_fence_create(
struct drm_sched_entity *s_entity, void *owner); struct drm_sched_entity *s_entity, void *owner);
void drm_sched_fence_scheduled(struct drm_sched_fence *fence); void drm_sched_fence_scheduled(struct drm_sched_fence *fence);