From: Rob Clark <[email protected]>

In error paths, we could unref the submit without calling
drm_sched_entity_push_job(), so msm_job_free() will never get
called.  Since drm_sched_job_cleanup() will NULL out the
s_fence, we can use that to detect this case.

Signed-off-by: Rob Clark <[email protected]>
---
 drivers/gpu/drm/msm/msm_gem_submit.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c 
b/drivers/gpu/drm/msm/msm_gem_submit.c
index 3e9aa2cc38ef..b2aeaecaa39b 100644
--- a/drivers/gpu/drm/msm/msm_gem_submit.c
+++ b/drivers/gpu/drm/msm/msm_gem_submit.c
@@ -85,6 +85,15 @@ void __msm_gem_submit_destroy(struct kref *kref)
                        container_of(kref, struct msm_gem_submit, ref);
        unsigned i;
 
+       /*
+        * In error paths, we could unref the submit without calling
+        * drm_sched_entity_push_job(), so msm_job_free() will never
+        * get called.  Since drm_sched_job_cleanup() will NULL out
+        * s_fence, we can use that to detect this case.
+        */
+       if (submit->base.s_fence)
+               drm_sched_job_cleanup(&submit->base);
+
        if (submit->fence_id) {
                spin_lock(&submit->queue->idr_lock);
                idr_remove(&submit->queue->fence_idr, submit->fence_id);
-- 
2.49.0

Reply via email to