aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authormonk.liu <monk.liu@amd.com>2015-07-17 06:39:25 -0400
committerAlex Deucher <alexander.deucher@amd.com>2015-08-17 16:50:22 -0400
commite60b344f6c0eff03362b5083db746ef5442c4b36 (patch)
tree7973e249113218e776978be20a6e5ffe375ce6cd /drivers/gpu/drm/amd/amdgpu
parent2f7d10b393c83acd3eedc3d6ab94dce29ac6a890 (diff)
drm/amdgpu: optimize amdgpu_parser_init
use kmalloc_array instead of kcalloc where appropriate and other cleanups. Signed-off-by: monk.liu <monk.liu@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 4794e14976ca..bc0a70415485 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -147,13 +147,13 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
147 147
148 /* get chunks */ 148 /* get chunks */
149 INIT_LIST_HEAD(&p->validated); 149 INIT_LIST_HEAD(&p->validated);
150 chunk_array = kcalloc(cs->in.num_chunks, sizeof(uint64_t), GFP_KERNEL); 150 chunk_array = kmalloc_array(cs->in.num_chunks, sizeof(uint64_t), GFP_KERNEL);
151 if (chunk_array == NULL) { 151 if (chunk_array == NULL) {
152 r = -ENOMEM; 152 r = -ENOMEM;
153 goto out; 153 goto out;
154 } 154 }
155 155
156 chunk_array_user = (uint64_t *)(unsigned long)(cs->in.chunks); 156 chunk_array_user = (uint64_t __user *)(cs->in.chunks);
157 if (copy_from_user(chunk_array, chunk_array_user, 157 if (copy_from_user(chunk_array, chunk_array_user,
158 sizeof(uint64_t)*cs->in.num_chunks)) { 158 sizeof(uint64_t)*cs->in.num_chunks)) {
159 r = -EFAULT; 159 r = -EFAULT;
@@ -161,7 +161,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
161 } 161 }
162 162
163 p->nchunks = cs->in.num_chunks; 163 p->nchunks = cs->in.num_chunks;
164 p->chunks = kcalloc(p->nchunks, sizeof(struct amdgpu_cs_chunk), 164 p->chunks = kmalloc_array(p->nchunks, sizeof(struct amdgpu_cs_chunk),
165 GFP_KERNEL); 165 GFP_KERNEL);
166 if (p->chunks == NULL) { 166 if (p->chunks == NULL) {
167 r = -ENOMEM; 167 r = -ENOMEM;
@@ -173,7 +173,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
173 struct drm_amdgpu_cs_chunk user_chunk; 173 struct drm_amdgpu_cs_chunk user_chunk;
174 uint32_t __user *cdata; 174 uint32_t __user *cdata;
175 175
176 chunk_ptr = (void __user *)(unsigned long)chunk_array[i]; 176 chunk_ptr = (void __user *)chunk_array[i];
177 if (copy_from_user(&user_chunk, chunk_ptr, 177 if (copy_from_user(&user_chunk, chunk_ptr,
178 sizeof(struct drm_amdgpu_cs_chunk))) { 178 sizeof(struct drm_amdgpu_cs_chunk))) {
179 r = -EFAULT; 179 r = -EFAULT;
@@ -183,7 +183,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
183 p->chunks[i].length_dw = user_chunk.length_dw; 183 p->chunks[i].length_dw = user_chunk.length_dw;
184 184
185 size = p->chunks[i].length_dw; 185 size = p->chunks[i].length_dw;
186 cdata = (void __user *)(unsigned long)user_chunk.chunk_data; 186 cdata = (void __user *)user_chunk.chunk_data;
187 p->chunks[i].user_ptr = cdata; 187 p->chunks[i].user_ptr = cdata;
188 188
189 p->chunks[i].kdata = drm_malloc_ab(size, sizeof(uint32_t)); 189 p->chunks[i].kdata = drm_malloc_ab(size, sizeof(uint32_t));
@@ -235,11 +235,10 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
235 } 235 }
236 } 236 }
237 237
238 p->ibs = kcalloc(p->num_ibs, sizeof(struct amdgpu_ib), GFP_KERNEL); 238
239 if (!p->ibs) { 239 p->ibs = kmalloc_array(p->num_ibs, sizeof(struct amdgpu_ib), GFP_KERNEL);
240 if (!p->ibs)
240 r = -ENOMEM; 241 r = -ENOMEM;
241 goto out;
242 }
243 242
244out: 243out:
245 kfree(chunk_array); 244 kfree(chunk_array);