diff options
author | Christian König <christian.koenig@amd.com> | 2015-11-05 11:00:25 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-11-16 11:05:51 -0500 |
commit | e4a58a28b50f30e72292b6659d94410cbf7355ad (patch) | |
tree | 7a7a9899f9baebe4fbc133c40f696a782e6f76eb /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |
parent | f5617f9dde5ae2466560f7cb008c741e2b88adab (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.c | 25 |
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, |