diff options
author | Christian König <christian.koenig@amd.com> | 2018-09-10 09:52:55 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-09-11 17:35:00 -0400 |
commit | 0165de983272d1fae0809ed9db47c46a412279bc (patch) | |
tree | 0b7bca340167bb6ab9a81951fd551b81ee9c17a2 /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |
parent | 3a74987b24279d242d17f522f8435f1942a3c948 (diff) |
drm/amdgpu: fix error handling in amdgpu_cs_user_fence_chunk
Slowly leaking memory one page at a time :)
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
Signed-off-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 | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 1b5a0a73d770..b31d121a876b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -39,6 +39,7 @@ static int amdgpu_cs_user_fence_chunk(struct amdgpu_cs_parser *p, | |||
39 | { | 39 | { |
40 | struct drm_gem_object *gobj; | 40 | struct drm_gem_object *gobj; |
41 | unsigned long size; | 41 | unsigned long size; |
42 | int r; | ||
42 | 43 | ||
43 | gobj = drm_gem_object_lookup(p->filp, data->handle); | 44 | gobj = drm_gem_object_lookup(p->filp, data->handle); |
44 | if (gobj == NULL) | 45 | if (gobj == NULL) |
@@ -50,20 +51,26 @@ static int amdgpu_cs_user_fence_chunk(struct amdgpu_cs_parser *p, | |||
50 | p->uf_entry.tv.shared = true; | 51 | p->uf_entry.tv.shared = true; |
51 | p->uf_entry.user_pages = NULL; | 52 | p->uf_entry.user_pages = NULL; |
52 | 53 | ||
53 | size = amdgpu_bo_size(p->uf_entry.robj); | ||
54 | if (size != PAGE_SIZE || (data->offset + 8) > size) | ||
55 | return -EINVAL; | ||
56 | |||
57 | *offset = data->offset; | ||
58 | |||
59 | drm_gem_object_put_unlocked(gobj); | 54 | drm_gem_object_put_unlocked(gobj); |
60 | 55 | ||
56 | size = amdgpu_bo_size(p->uf_entry.robj); | ||
57 | if (size != PAGE_SIZE || (data->offset + 8) > size) { | ||
58 | r = -EINVAL; | ||
59 | goto error_unref; | ||
60 | } | ||
61 | |||
61 | if (amdgpu_ttm_tt_get_usermm(p->uf_entry.robj->tbo.ttm)) { | 62 | if (amdgpu_ttm_tt_get_usermm(p->uf_entry.robj->tbo.ttm)) { |
62 | amdgpu_bo_unref(&p->uf_entry.robj); | 63 | r = -EINVAL; |
63 | return -EINVAL; | 64 | goto error_unref; |
64 | } | 65 | } |
65 | 66 | ||
67 | *offset = data->offset; | ||
68 | |||
66 | return 0; | 69 | return 0; |
70 | |||
71 | error_unref: | ||
72 | amdgpu_bo_unref(&p->uf_entry.robj); | ||
73 | return r; | ||
67 | } | 74 | } |
68 | 75 | ||
69 | static int amdgpu_cs_bo_handles_chunk(struct amdgpu_cs_parser *p, | 76 | static int amdgpu_cs_bo_handles_chunk(struct amdgpu_cs_parser *p, |