diff options
author | Rob Clark <robdclark@gmail.com> | 2016-05-03 16:50:26 +0300 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2016-05-08 17:22:18 +0300 |
commit | 40e6815bba6e34e5560e8855b43cd3eb17b24b09 (patch) | |
tree | 4ab8a563c1e43974f3d4edc12f1e20625176727f /drivers/gpu/drm/msm/msm_gem_submit.c | |
parent | 6860b56c4b84bf9dba479c3f881d45a0b09a879c (diff) | |
download | linux-40e6815bba6e34e5560e8855b43cd3eb17b24b09.tar.xz |
drm/msm: fix leak in failed submit path
Signed-off-by: Rob Clark <robdclark@gmail.com>
Diffstat (limited to 'drivers/gpu/drm/msm/msm_gem_submit.c')
-rw-r--r-- | drivers/gpu/drm/msm/msm_gem_submit.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index 96c595c9ab93..711a658cf1ea 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -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; } |