Commit b4d916ee authored by Chen Li's avatar Chen Li Committed by Alex Deucher

drm/amdgpu: Use kvmalloc for CS chunks

The number of chunks/chunks_array may be passed in
by userspace and can be large.
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarChen Li <chenli@uniontech.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent fec432f5
...@@ -117,7 +117,7 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs ...@@ -117,7 +117,7 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs
if (cs->in.num_chunks == 0) if (cs->in.num_chunks == 0)
return 0; return 0;
chunk_array = kmalloc_array(cs->in.num_chunks, sizeof(uint64_t), GFP_KERNEL); chunk_array = kvmalloc_array(cs->in.num_chunks, sizeof(uint64_t), GFP_KERNEL);
if (!chunk_array) if (!chunk_array)
return -ENOMEM; return -ENOMEM;
...@@ -144,7 +144,7 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs ...@@ -144,7 +144,7 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs
} }
p->nchunks = cs->in.num_chunks; p->nchunks = cs->in.num_chunks;
p->chunks = kmalloc_array(p->nchunks, sizeof(struct amdgpu_cs_chunk), p->chunks = kvmalloc_array(p->nchunks, sizeof(struct amdgpu_cs_chunk),
GFP_KERNEL); GFP_KERNEL);
if (!p->chunks) { if (!p->chunks) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -238,7 +238,7 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs ...@@ -238,7 +238,7 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs
if (p->uf_entry.tv.bo) if (p->uf_entry.tv.bo)
p->job->uf_addr = uf_offset; p->job->uf_addr = uf_offset;
kfree(chunk_array); kvfree(chunk_array);
/* Use this opportunity to fill in task info for the vm */ /* Use this opportunity to fill in task info for the vm */
amdgpu_vm_set_task_info(vm); amdgpu_vm_set_task_info(vm);
...@@ -250,11 +250,11 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs ...@@ -250,11 +250,11 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs
free_partial_kdata: free_partial_kdata:
for (; i >= 0; i--) for (; i >= 0; i--)
kvfree(p->chunks[i].kdata); kvfree(p->chunks[i].kdata);
kfree(p->chunks); kvfree(p->chunks);
p->chunks = NULL; p->chunks = NULL;
p->nchunks = 0; p->nchunks = 0;
free_chunk: free_chunk:
kfree(chunk_array); kvfree(chunk_array);
return ret; return ret;
} }
...@@ -706,7 +706,7 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error, ...@@ -706,7 +706,7 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error,
for (i = 0; i < parser->nchunks; i++) for (i = 0; i < parser->nchunks; i++)
kvfree(parser->chunks[i].kdata); kvfree(parser->chunks[i].kdata);
kfree(parser->chunks); kvfree(parser->chunks);
if (parser->job) if (parser->job)
amdgpu_job_free(parser->job); amdgpu_job_free(parser->job);
if (parser->uf_entry.tv.bo) { if (parser->uf_entry.tv.bo) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment