Skip to content

Commit 4970a8b

Browse files
MrVangregkh
authored andcommitted
mm/cma.c: cma_declare_contiguous: correct err handling
[ Upstream commit 0d3bd18 ] In case cma_init_reserved_mem failed, need to free the memblock allocated by memblock_reserve or memblock_alloc_range. Quote Catalin's comments: https://lkml.org/lkml/2019/2/26/482 Kmemleak is supposed to work with the memblock_{alloc,free} pair and it ignores the memblock_reserve() as a memblock_alloc() implementation detail. It is, however, tolerant to memblock_free() being called on a sub-range or just a different range from a previous memblock_alloc(). So the original patch looks fine to me. FWIW: Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Peng Fan <[email protected]> Reviewed-by: Catalin Marinas <[email protected]> Reviewed-by: Mike Rapoport <[email protected]> Cc: Laura Abbott <[email protected]> Cc: Joonsoo Kim <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Vlastimil Babka <[email protected]> Cc: Marek Szyprowski <[email protected]> Cc: Andrey Konovalov <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 722a15d commit 4970a8b

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

mm/cma.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,12 +339,14 @@ int __init cma_declare_contiguous(phys_addr_t base,
339339

340340
ret = cma_init_reserved_mem(base, size, order_per_bit, res_cma);
341341
if (ret)
342-
goto err;
342+
goto free_mem;
343343

344344
pr_info("Reserved %ld MiB at %pa\n", (unsigned long)size / SZ_1M,
345345
&base);
346346
return 0;
347347

348+
free_mem:
349+
memblock_free(base, size);
348350
err:
349351
pr_err("Failed to reserve %ld MiB\n", (unsigned long)size / SZ_1M);
350352
return ret;

0 commit comments

Comments
 (0)