[PATCH] drm/amdgpu: prevent memory leaks in AMDGPU_CS ioctl
Christian König
ckoenig.leichtzumerken at gmail.com
Wed Aug 21 14:33:30 UTC 2019
Am 21.08.19 um 16:29 schrieb Haehnle, Nicolai:
> Error out if the AMDGPU_CS ioctl is called with multiple SYNCOBJ_OUT and/or
> TIMELINE_SIGNAL chunks, since otherwise the last chunk wins while the
> allocated array as well as the reference counts of sync objects are leaked.
>
> Signed-off-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
We could shorten the function names at some point as well, but that's
unrelated to this patch.
Reviewed-by: Christian König <christian.koenig at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> index def029ab5657..fd95b586b590 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> @@ -1134,20 +1134,23 @@ static int amdgpu_cs_process_syncobj_out_dep(struct amdgpu_cs_parser *p,
> struct amdgpu_cs_chunk *chunk)
> {
> struct drm_amdgpu_cs_chunk_sem *deps;
> unsigned num_deps;
> int i;
>
> deps = (struct drm_amdgpu_cs_chunk_sem *)chunk->kdata;
> num_deps = chunk->length_dw * 4 /
> sizeof(struct drm_amdgpu_cs_chunk_sem);
>
> + if (p->post_deps)
> + return -EINVAL;
> +
> p->post_deps = kmalloc_array(num_deps, sizeof(*p->post_deps),
> GFP_KERNEL);
> p->num_post_deps = 0;
>
> if (!p->post_deps)
> return -ENOMEM;
>
>
> for (i = 0; i < num_deps; ++i) {
> p->post_deps[i].syncobj =
> @@ -1157,31 +1160,33 @@ static int amdgpu_cs_process_syncobj_out_dep(struct amdgpu_cs_parser *p,
> p->post_deps[i].chain = NULL;
> p->post_deps[i].point = 0;
> p->num_post_deps++;
> }
>
> return 0;
> }
>
>
> static int amdgpu_cs_process_syncobj_timeline_out_dep(struct amdgpu_cs_parser *p,
> - struct amdgpu_cs_chunk
> - *chunk)
> + struct amdgpu_cs_chunk *chunk)
> {
> struct drm_amdgpu_cs_chunk_syncobj *syncobj_deps;
> unsigned num_deps;
> int i;
>
> syncobj_deps = (struct drm_amdgpu_cs_chunk_syncobj *)chunk->kdata;
> num_deps = chunk->length_dw * 4 /
> sizeof(struct drm_amdgpu_cs_chunk_syncobj);
>
> + if (p->post_deps)
> + return -EINVAL;
> +
> p->post_deps = kmalloc_array(num_deps, sizeof(*p->post_deps),
> GFP_KERNEL);
> p->num_post_deps = 0;
>
> if (!p->post_deps)
> return -ENOMEM;
>
> for (i = 0; i < num_deps; ++i) {
> struct amdgpu_cs_post_dep *dep = &p->post_deps[i];
>
More information about the amd-gfx
mailing list