]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/radeon: Use drm_calloc_ab for CS relocs
authorMichel Dänzer <michel.daenzer@amd.com>
Thu, 16 Apr 2015 02:17:27 +0000 (11:17 +0900)
committerZefan Li <lizefan@huawei.com>
Fri, 18 Sep 2015 01:20:33 +0000 (09:20 +0800)
commit b421ed15d2c3039eb724680e4de1e4b2bd196a9a upstream.

The number of relocs is passed in by userspace and can be large. It has
been observed to cause kcalloc failures in the wild.

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
[lizf: Backported to 3.4: adjust context]
Signed-off-by: Zefan Li <lizefan@huawei.com>
drivers/gpu/drm/radeon/radeon_cs.c

index f3ee36036487456e8f008fdbcfd70ddd61db1217..d66d2cdf4f0abe91b0d5a0d26ee8579de2e69acb 100644 (file)
@@ -49,7 +49,7 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
        if (p->relocs_ptr == NULL) {
                return -ENOMEM;
        }
-       p->relocs = kcalloc(p->nrelocs, sizeof(struct radeon_cs_reloc), GFP_KERNEL);
+       p->relocs = drm_calloc_large(p->nrelocs, sizeof(struct radeon_bo_list));
        if (p->relocs == NULL) {
                return -ENOMEM;
        }
@@ -324,7 +324,7 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error)
                }
        }
        kfree(parser->track);
-       kfree(parser->relocs);
+       drm_free_large(parser->relocs);
        kfree(parser->relocs_ptr);
        for (i = 0; i < parser->nchunks; i++) {
                kfree(parser->chunks[i].kdata);