Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 40e6815b authored by Rob Clark's avatar Rob Clark
Browse files

drm/msm: fix leak in failed submit path



Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
parent 6860b56c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);

+11 −2
Original line number Diff line number Diff line
@@ -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;
}
+1 −3
Original line number Diff line number Diff line
@@ -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)