aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2015-11-05 11:00:25 -0500
committerAlex Deucher <alexander.deucher@amd.com>2015-11-16 11:05:51 -0500
commite4a58a28b50f30e72292b6659d94410cbf7355ad (patch)
tree7a7a9899f9baebe4fbc133c40f696a782e6f76eb /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
parentf5617f9dde5ae2466560f7cb008c741e2b88adab (diff)
drm/amdgpu: fix leaking the IBs on error
Fixing a memory leak when the scheduler is enabled. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index dfc4d02c7a38..ecc82dfe83f8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -499,16 +499,12 @@ static void amdgpu_cs_parser_fini_late(struct amdgpu_cs_parser *parser)
499 for (i = 0; i < parser->nchunks; i++) 499 for (i = 0; i < parser->nchunks; i++)
500 drm_free_large(parser->chunks[i].kdata); 500 drm_free_large(parser->chunks[i].kdata);
501 kfree(parser->chunks); 501 kfree(parser->chunks);
502 if (!amdgpu_enable_scheduler) 502 if (parser->ibs)
503 { 503 for (i = 0; i < parser->num_ibs; i++)
504 if (parser->ibs) 504 amdgpu_ib_free(parser->adev, &parser->ibs[i]);
505 for (i = 0; i < parser->num_ibs; i++) 505 kfree(parser->ibs);
506 amdgpu_ib_free(parser->adev, &parser->ibs[i]); 506 if (parser->uf.bo)
507 kfree(parser->ibs); 507 drm_gem_object_unreference_unlocked(&parser->uf.bo->gem_base);
508 if (parser->uf.bo)
509 drm_gem_object_unreference_unlocked(&parser->uf.bo->gem_base);
510 }
511
512 kfree(parser); 508 kfree(parser);
513} 509}
514 510
@@ -888,11 +884,14 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
888 job->base.owner = parser->filp; 884 job->base.owner = parser->filp;
889 mutex_init(&job->job_lock); 885 mutex_init(&job->job_lock);
890 if (job->ibs[job->num_ibs - 1].user) { 886 if (job->ibs[job->num_ibs - 1].user) {
891 memcpy(&job->uf, &parser->uf, 887 job->uf = parser->uf;
892 sizeof(struct amdgpu_user_fence));
893 job->ibs[job->num_ibs - 1].user = &job->uf; 888 job->ibs[job->num_ibs - 1].user = &job->uf;
889 parser->uf.bo = NULL;
894 } 890 }
895 891
892 parser->ibs = NULL;
893 parser->num_ibs = 0;
894
896 job->free_job = amdgpu_cs_free_job; 895 job->free_job = amdgpu_cs_free_job;
897 mutex_lock(&job->job_lock); 896 mutex_lock(&job->job_lock);
898 r = amd_sched_entity_push_job(&job->base); 897 r = amd_sched_entity_push_job(&job->base);
@@ -905,7 +904,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
905 cs->out.handle = 904 cs->out.handle =
906 amdgpu_ctx_add_fence(parser->ctx, ring, 905 amdgpu_ctx_add_fence(parser->ctx, ring,
907 &job->base.s_fence->base); 906 &job->base.s_fence->base);
908 parser->ibs[parser->num_ibs - 1].sequence = cs->out.handle; 907 job->ibs[job->num_ibs - 1].sequence = cs->out.handle;
909 908
910 list_sort(NULL, &parser->validated, cmp_size_smaller_first); 909 list_sort(NULL, &parser->validated, cmp_size_smaller_first);
911 ttm_eu_fence_buffer_objects(&parser->ticket, 910 ttm_eu_fence_buffer_objects(&parser->ticket,