Commit 7febe4bf authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

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: default avatarChristian König <christian.koenig@amd.com>
Acked-by: default avatarNayan Deshmukh <nayan26deshmukh@gmail.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent bf9b1d9d
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -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);
	}
}

+23 −13
Original line number Diff line number Diff line
@@ -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
 * @rq: scheduler run queue
 * @priority: scheduler priority
 *
 * Sets the run queue for an entity and removes the entity from the previous
 * run queue in which was present.
 * Update the priority of runqueus used for the entity.
 */
void drm_sched_entity_set_rq(struct drm_sched_entity *entity,
			     struct drm_sched_rq *rq)
void drm_sched_entity_set_priority(struct drm_sched_entity *entity,
				   enum drm_sched_priority priority)
{
	if (entity->rq == rq)
		return;

	BUG_ON(!rq);
	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);
	entity->rq = rq;
	drm_sched_rq_add_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_rq);
EXPORT_SYMBOL(drm_sched_entity_set_priority);

/**
 * drm_sched_dependency_optimized
+2 −3
Original line number Diff line number Diff line
@@ -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_push_job(struct drm_sched_job *sched_job,
			       struct drm_sched_entity *entity);
void drm_sched_entity_set_rq(struct drm_sched_entity *entity,
			     struct drm_sched_rq *rq);

void drm_sched_entity_set_priority(struct drm_sched_entity *entity,
				   enum drm_sched_priority priority);
struct drm_sched_fence *drm_sched_fence_create(
	struct drm_sched_entity *s_entity, void *owner);
void drm_sched_fence_scheduled(struct drm_sched_fence *fence);