drm/radeon: Use kvmalloc for CS chunks

The number of chunks/chunks_array may be passed in
by userspace and can be large.

It has been observed to cause kcalloc failures from trinity fuzzy test:

 WARNING: CPU: 0 PID: 5487 at mm/page_alloc.c:4385
 __alloc_pages_nodemask+0x2d8/0x14d0

Obviously, the required order in this case is larger than MAX_ORDER.
So, just use kvmalloc instead.

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Chen Li <chenli@uniontech.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Chen Li 2021-03-02 14:42:12 +08:00 committed by Alex Deucher
parent 7c7dd77489
commit 3fcb4f01de
1 changed files with 4 additions and 4 deletions

View File

@ -288,7 +288,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
p->chunk_relocs = NULL; p->chunk_relocs = NULL;
p->chunk_flags = NULL; p->chunk_flags = NULL;
p->chunk_const_ib = NULL; p->chunk_const_ib = NULL;
p->chunks_array = kcalloc(cs->num_chunks, sizeof(uint64_t), GFP_KERNEL); p->chunks_array = kvmalloc_array(cs->num_chunks, sizeof(uint64_t), GFP_KERNEL);
if (p->chunks_array == NULL) { if (p->chunks_array == NULL) {
return -ENOMEM; return -ENOMEM;
} }
@ -299,7 +299,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
} }
p->cs_flags = 0; p->cs_flags = 0;
p->nchunks = cs->num_chunks; p->nchunks = cs->num_chunks;
p->chunks = kcalloc(p->nchunks, sizeof(struct radeon_cs_chunk), GFP_KERNEL); p->chunks = kvmalloc_array(p->nchunks, sizeof(struct radeon_cs_chunk), GFP_KERNEL);
if (p->chunks == NULL) { if (p->chunks == NULL) {
return -ENOMEM; return -ENOMEM;
} }
@ -452,8 +452,8 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo
kvfree(parser->vm_bos); kvfree(parser->vm_bos);
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);
kfree(parser->chunks_array); kvfree(parser->chunks_array);
radeon_ib_free(parser->rdev, &parser->ib); radeon_ib_free(parser->rdev, &parser->ib);
radeon_ib_free(parser->rdev, &parser->const_ib); radeon_ib_free(parser->rdev, &parser->const_ib);
} }