drm/msm: fix leak in failed submit path
authorRob Clark <robdclark@gmail.com>
Tue, 3 May 2016 13:50:26 +0000 (09:50 -0400)
committerRob Clark <robdclark@gmail.com>
Sun, 8 May 2016 14:22:18 +0000 (10:22 -0400)
Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/msm_drv.h
drivers/gpu/drm/msm/msm_gem_submit.c
drivers/gpu/drm/msm/msm_gpu.c

index 4114a40e4a09af4dd63a4d6249fbc18330cbd535..5b2963f32291bd0e4c1423c893090fbdf63212dc 100644 (file)
@@ -161,6 +161,7 @@ int msm_atomic_commit(struct drm_device *dev,
 
 int msm_register_mmu(struct drm_device *dev, struct msm_mmu *mmu);
 
+void msm_gem_submit_free(struct msm_gem_submit *submit);
 int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
                struct drm_file *file);
 
index 96c595c9ab936cf0cdfab63e36e6d18308bd995b..711a658cf1ea8772df99b2ce05ce5ad2e296980b 100644 (file)
@@ -56,6 +56,13 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev,
        return submit;
 }
 
+void msm_gem_submit_free(struct msm_gem_submit *submit)
+{
+       fence_put(submit->fence);
+       list_del(&submit->node);
+       kfree(submit);
+}
+
 static int submit_lookup_objects(struct msm_gem_submit *submit,
                struct drm_msm_gem_submit *args, struct drm_file *file)
 {
@@ -324,7 +331,7 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
        return 0;
 }
 
-static void submit_cleanup(struct msm_gem_submit *submit, bool fail)
+static void submit_cleanup(struct msm_gem_submit *submit)
 {
        unsigned i;
 
@@ -448,7 +455,9 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
        args->fence = submit->fence->seqno;
 
 out:
-       submit_cleanup(submit, !!ret);
+       submit_cleanup(submit);
+       if (ret)
+               msm_gem_submit_free(submit);
        mutex_unlock(&dev->struct_mutex);
        return ret;
 }
index 4c4f4b5abe2c5acc76ac99698f7f29b09e811403..5aed93a87e4c1b20dc61539785196048faecab64 100644 (file)
@@ -446,9 +446,7 @@ static void retire_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
                drm_gem_object_unreference(&msm_obj->base);
        }
 
-       fence_put(submit->fence);
-       list_del(&submit->node);
-       kfree(submit);
+       msm_gem_submit_free(submit);
 }
 
 static void retire_submits(struct msm_gpu *gpu)