Add an error path to pvr_queue_run_job() instead of just a warning and release the KCCB in that path.
Signed-off-by: Alexandru Dadu <[email protected]> --- drivers/gpu/drm/imagination/pvr_queue.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/imagination/pvr_queue.c b/drivers/gpu/drm/imagination/pvr_queue.c index 24a8645aa913..8dd87192fabc 100644 --- a/drivers/gpu/drm/imagination/pvr_queue.c +++ b/drivers/gpu/drm/imagination/pvr_queue.c @@ -767,17 +767,19 @@ static struct dma_fence *pvr_queue_run_job(struct drm_sched_job *sched_job) (job->type != DRM_PVR_JOB_TYPE_GEOMETRY || job->paired_job->type != DRM_PVR_JOB_TYPE_FRAGMENT || job->hwrt != job->paired_job->hwrt || - job->ctx != job->paired_job->ctx))) - return ERR_PTR(-EINVAL); + job->ctx != job->paired_job->ctx))) { + err = -EINVAL; + goto err_release; + } err = pvr_job_get_pm_ref(job); if (WARN_ON(err)) - return ERR_PTR(err); + goto err_release; if (job->paired_job) { err = pvr_job_get_pm_ref(job->paired_job); if (WARN_ON(err)) - return ERR_PTR(err); + goto err_release; } /* Submit our job to the CCCB */ @@ -814,7 +816,14 @@ static struct dma_fence *pvr_queue_run_job(struct drm_sched_job *sched_job) trace_pvr_job_submit_fw(job); } + if (WARN_ON(err)) + goto err_release; + return dma_fence_get(job->done_fence); + +err_release: + pvr_kccb_release_slot(pvr_dev); + return ERR_PTR(err); } static void pvr_queue_stop(struct pvr_queue *queue, struct pvr_job *bad_job) -- 2.43.0
