aboutsummaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/scheduler
diff options
context:
space:
mode:
authorChunming Zhou <david1.zhou@amd.com>2015-08-18 15:16:40 +0800
committerAlex Deucher <alexander.deucher@amd.com>2015-08-20 17:00:35 -0400
commitbb977d3711ed1de1601b463e7fd5a43d82a2b077 (patch)
tree25ce4d1396258790d27ca111f246df39c49e1027 /drivers/gpu/drm/amd/scheduler
parent6055f37afd8b68aaf512532e7e2dd651df2d7833 (diff)
drm/amdgpu: abstract amdgpu_job for scheduler
Signed-off-by: Chunming Zhou <david1.zhou@amd.com> Reviewed-by: Christian K?nig <christian.koenig@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/scheduler')
-rw-r--r--drivers/gpu/drm/amd/scheduler/gpu_scheduler.c42
-rw-r--r--drivers/gpu/drm/amd/scheduler/gpu_scheduler.h6
2 files changed, 16 insertions, 32 deletions
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
index 265d3e2f63cc..462c1617d56e 100644
--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
@@ -282,30 +282,18 @@ int amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
* scheduler consum some queued command.
* -1 other fail.
*/
-int amd_sched_push_job(struct amd_gpu_scheduler *sched,
- struct amd_sched_entity *c_entity,
- void *data,
- struct amd_sched_fence **fence)
+int amd_sched_push_job(struct amd_sched_job *sched_job)
{
- struct amd_sched_job *job;
-
+ struct amd_sched_fence *fence =
+ amd_sched_fence_create(sched_job->s_entity);
if (!fence)
return -EINVAL;
- job = kzalloc(sizeof(struct amd_sched_job), GFP_KERNEL);
- if (!job)
- return -ENOMEM;
- job->sched = sched;
- job->s_entity = c_entity;
- job->data = data;
- *fence = amd_sched_fence_create(c_entity);
- if ((*fence) == NULL) {
- kfree(job);
- return -EINVAL;
- }
- fence_get(&(*fence)->base);
- job->s_fence = *fence;
- while (kfifo_in_spinlocked(&c_entity->job_queue, &job, sizeof(void *),
- &c_entity->queue_lock) != sizeof(void *)) {
+ fence_get(&fence->base);
+ sched_job->s_fence = fence;
+ while (kfifo_in_spinlocked(&sched_job->s_entity->job_queue,
+ &sched_job, sizeof(void *),
+ &sched_job->s_entity->queue_lock) !=
+ sizeof(void *)) {
/**
* Current context used up all its IB slots
* wait here, or need to check whether GPU is hung
@@ -313,8 +301,8 @@ int amd_sched_push_job(struct amd_gpu_scheduler *sched,
schedule();
}
/* first job wake up scheduler */
- if ((kfifo_len(&c_entity->job_queue) / sizeof(void *)) == 1)
- wake_up_interruptible(&sched->wait_queue);
+ if ((kfifo_len(&sched_job->s_entity->job_queue) / sizeof(void *)) == 1)
+ wake_up_interruptible(&sched_job->sched->wait_queue);
return 0;
}
@@ -333,10 +321,8 @@ static void amd_sched_process_job(struct fence *f, struct fence_cb *cb)
list_del(&sched_job->list);
atomic64_dec(&sched->hw_rq_count);
spin_unlock_irqrestore(&sched->queue_lock, flags);
-
- sched->ops->process_job(sched, sched_job);
fence_put(&sched_job->s_fence->base);
- kfree(sched_job);
+ sched->ops->process_job(sched, sched_job);
wake_up_interruptible(&sched->wait_queue);
}
@@ -359,7 +345,9 @@ static int amd_sched_main(void *param)
r = kfifo_out(&c_entity->job_queue, &job, sizeof(void *));
if (r != sizeof(void *))
continue;
- r = sched->ops->prepare_job(sched, c_entity, job);
+ r = 0;
+ if (sched->ops->prepare_job)
+ r = sched->ops->prepare_job(sched, c_entity, job);
if (!r) {
unsigned long flags;
spin_lock_irqsave(&sched->queue_lock, flags);
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
index ceb5918bfbeb..25e38d030157 100644
--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
@@ -81,7 +81,6 @@ struct amd_sched_job {
struct fence_cb cb;
struct amd_gpu_scheduler *sched;
struct amd_sched_entity *s_entity;
- void *data;
struct amd_sched_fence *s_fence;
};
@@ -140,10 +139,7 @@ struct amd_gpu_scheduler *amd_sched_create(void *device,
uint32_t hw_submission);
int amd_sched_destroy(struct amd_gpu_scheduler *sched);
-int amd_sched_push_job(struct amd_gpu_scheduler *sched,
- struct amd_sched_entity *c_entity,
- void *data,
- struct amd_sched_fence **fence);
+int amd_sched_push_job(struct amd_sched_job *sched_job);
int amd_sched_entity_init(struct amd_gpu_scheduler *sched,
struct amd_sched_entity *entity,