drm/scheduler: Add drm_sched_job_cleanup
This patch adds a new API to clean up the scheduler job resources. This is primarliy needed in cases the job was created but was not queued to the scheduler queue. Additionally with this change, the layer which creates the scheduler job also gets to free up the job's resources and this entails moving the dma_fence_put(finished_fence) to the drivers ops free handler routines. Signed-off-by: Sharat Masetty <smasetty@codeaurora.org> Reviewed-by: Christian König <christian.koenig@amd.com> Acked-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
98079389a8
commit
26efecf955
|
@ -1260,8 +1260,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
|
|||
return 0;
|
||||
|
||||
error_abort:
|
||||
dma_fence_put(&job->base.s_fence->finished);
|
||||
job->base.s_fence = NULL;
|
||||
drm_sched_job_cleanup(&job->base);
|
||||
amdgpu_mn_unlock(p->mn);
|
||||
|
||||
error_unlock:
|
||||
|
|
|
@ -112,6 +112,8 @@ static void amdgpu_job_free_cb(struct drm_sched_job *s_job)
|
|||
struct amdgpu_ring *ring = to_amdgpu_ring(s_job->sched);
|
||||
struct amdgpu_job *job = to_amdgpu_job(s_job);
|
||||
|
||||
drm_sched_job_cleanup(s_job);
|
||||
|
||||
amdgpu_ring_priority_put(ring, s_job->s_priority);
|
||||
dma_fence_put(job->fence);
|
||||
amdgpu_sync_free(&job->sync);
|
||||
|
|
|
@ -125,6 +125,8 @@ static void etnaviv_sched_free_job(struct drm_sched_job *sched_job)
|
|||
{
|
||||
struct etnaviv_gem_submit *submit = to_etnaviv_submit(sched_job);
|
||||
|
||||
drm_sched_job_cleanup(sched_job);
|
||||
|
||||
etnaviv_submit_put(submit);
|
||||
}
|
||||
|
||||
|
@ -157,6 +159,7 @@ int etnaviv_sched_push_job(struct drm_sched_entity *sched_entity,
|
|||
submit->out_fence, 0,
|
||||
INT_MAX, GFP_KERNEL);
|
||||
if (submit->out_fence_id < 0) {
|
||||
drm_sched_job_cleanup(&submit->sched_job);
|
||||
ret = -ENOMEM;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
|
|
@ -211,7 +211,6 @@ static void drm_sched_entity_kill_jobs_cb(struct dma_fence *f,
|
|||
|
||||
drm_sched_fence_finished(job->s_fence);
|
||||
WARN_ON(job->s_fence->parent);
|
||||
dma_fence_put(&job->s_fence->finished);
|
||||
job->sched->ops->free_job(job);
|
||||
}
|
||||
|
||||
|
|
|
@ -233,7 +233,6 @@ static void drm_sched_job_finish(struct work_struct *work)
|
|||
drm_sched_start_timeout(sched);
|
||||
spin_unlock(&sched->job_list_lock);
|
||||
|
||||
dma_fence_put(&s_job->s_fence->finished);
|
||||
sched->ops->free_job(s_job);
|
||||
}
|
||||
|
||||
|
@ -440,6 +439,18 @@ int drm_sched_job_init(struct drm_sched_job *job,
|
|||
}
|
||||
EXPORT_SYMBOL(drm_sched_job_init);
|
||||
|
||||
/**
|
||||
* drm_sched_job_cleanup - clean up scheduler job resources
|
||||
*
|
||||
* @job: scheduler job to clean up
|
||||
*/
|
||||
void drm_sched_job_cleanup(struct drm_sched_job *job)
|
||||
{
|
||||
dma_fence_put(&job->s_fence->finished);
|
||||
job->s_fence = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_sched_job_cleanup);
|
||||
|
||||
/**
|
||||
* drm_sched_ready - is the scheduler ready
|
||||
*
|
||||
|
|
|
@ -35,6 +35,8 @@ v3d_job_free(struct drm_sched_job *sched_job)
|
|||
{
|
||||
struct v3d_job *job = to_v3d_job(sched_job);
|
||||
|
||||
drm_sched_job_cleanup(sched_job);
|
||||
|
||||
v3d_exec_put(job->exec);
|
||||
}
|
||||
|
||||
|
|
|
@ -296,6 +296,7 @@ void drm_sched_fini(struct drm_gpu_scheduler *sched);
|
|||
int drm_sched_job_init(struct drm_sched_job *job,
|
||||
struct drm_sched_entity *entity,
|
||||
void *owner);
|
||||
void drm_sched_job_cleanup(struct drm_sched_job *job);
|
||||
void drm_sched_wakeup(struct drm_gpu_scheduler *sched);
|
||||
void drm_sched_hw_job_reset(struct drm_gpu_scheduler *sched,
|
||||
struct drm_sched_job *job);
|
||||
|
|
Loading…
Reference in New Issue