Commit 9ebbaabe authored by Andres Rodriguez's avatar Andres Rodriguez Committed by Alex Deucher

drm/amd/sched: allow clients to edit an entity's rq v2

This is useful for changing an entity's priority at runtime.

v2: don't modify the order of amd_sched_entity members
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAndres Rodriguez <andresx7@gmail.com>
Acked-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent b6d8a439
...@@ -133,6 +133,7 @@ int amd_sched_entity_init(struct amd_gpu_scheduler *sched, ...@@ -133,6 +133,7 @@ int amd_sched_entity_init(struct amd_gpu_scheduler *sched,
entity->rq = rq; entity->rq = rq;
entity->sched = sched; entity->sched = sched;
spin_lock_init(&entity->rq_lock);
spin_lock_init(&entity->queue_lock); spin_lock_init(&entity->queue_lock);
r = kfifo_alloc(&entity->job_queue, jobs * sizeof(void *), GFP_KERNEL); r = kfifo_alloc(&entity->job_queue, jobs * sizeof(void *), GFP_KERNEL);
if (r) if (r)
...@@ -204,7 +205,6 @@ static bool amd_sched_entity_is_ready(struct amd_sched_entity *entity) ...@@ -204,7 +205,6 @@ static bool amd_sched_entity_is_ready(struct amd_sched_entity *entity)
void amd_sched_entity_fini(struct amd_gpu_scheduler *sched, void amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
struct amd_sched_entity *entity) struct amd_sched_entity *entity)
{ {
struct amd_sched_rq *rq = entity->rq;
int r; int r;
if (!amd_sched_entity_is_initialized(sched, entity)) if (!amd_sched_entity_is_initialized(sched, entity))
...@@ -218,7 +218,7 @@ void amd_sched_entity_fini(struct amd_gpu_scheduler *sched, ...@@ -218,7 +218,7 @@ void amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
else else
r = wait_event_killable(sched->job_scheduled, r = wait_event_killable(sched->job_scheduled,
amd_sched_entity_is_idle(entity)); amd_sched_entity_is_idle(entity));
amd_sched_rq_remove_entity(rq, entity); amd_sched_entity_set_rq(entity, NULL);
if (r) { if (r) {
struct amd_sched_job *job; struct amd_sched_job *job;
...@@ -257,6 +257,24 @@ static void amd_sched_entity_clear_dep(struct dma_fence *f, struct dma_fence_cb ...@@ -257,6 +257,24 @@ static void amd_sched_entity_clear_dep(struct dma_fence *f, struct dma_fence_cb
dma_fence_put(f); dma_fence_put(f);
} }
void amd_sched_entity_set_rq(struct amd_sched_entity *entity,
struct amd_sched_rq *rq)
{
if (entity->rq == rq)
return;
spin_lock(&entity->rq_lock);
if (entity->rq)
amd_sched_rq_remove_entity(entity->rq, entity);
entity->rq = rq;
if (rq)
amd_sched_rq_add_entity(rq, entity);
spin_unlock(&entity->rq_lock);
}
bool amd_sched_dependency_optimized(struct dma_fence* fence, bool amd_sched_dependency_optimized(struct dma_fence* fence,
struct amd_sched_entity *entity) struct amd_sched_entity *entity)
{ {
...@@ -354,7 +372,9 @@ static bool amd_sched_entity_in(struct amd_sched_job *sched_job) ...@@ -354,7 +372,9 @@ static bool amd_sched_entity_in(struct amd_sched_job *sched_job)
/* first job wakes up scheduler */ /* first job wakes up scheduler */
if (first) { if (first) {
/* Add the entity to the run queue */ /* Add the entity to the run queue */
spin_lock(&entity->rq_lock);
amd_sched_rq_add_entity(entity->rq, entity); amd_sched_rq_add_entity(entity->rq, entity);
spin_unlock(&entity->rq_lock);
amd_sched_wakeup(sched); amd_sched_wakeup(sched);
} }
return added; return added;
......
...@@ -39,6 +39,7 @@ struct amd_sched_rq; ...@@ -39,6 +39,7 @@ struct amd_sched_rq;
struct amd_sched_entity { struct amd_sched_entity {
struct list_head list; struct list_head list;
struct amd_sched_rq *rq; struct amd_sched_rq *rq;
spinlock_t rq_lock;
struct amd_gpu_scheduler *sched; struct amd_gpu_scheduler *sched;
spinlock_t queue_lock; spinlock_t queue_lock;
...@@ -154,6 +155,8 @@ int amd_sched_entity_init(struct amd_gpu_scheduler *sched, ...@@ -154,6 +155,8 @@ int amd_sched_entity_init(struct amd_gpu_scheduler *sched,
void amd_sched_entity_fini(struct amd_gpu_scheduler *sched, void amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
struct amd_sched_entity *entity); struct amd_sched_entity *entity);
void amd_sched_entity_push_job(struct amd_sched_job *sched_job); void amd_sched_entity_push_job(struct amd_sched_job *sched_job);
void amd_sched_entity_set_rq(struct amd_sched_entity *entity,
struct amd_sched_rq *rq);
int amd_sched_fence_slab_init(void); int amd_sched_fence_slab_init(void);
void amd_sched_fence_slab_fini(void); void amd_sched_fence_slab_fini(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment