Commit 300e56a4b57a8be6f7aae7328bf23a4e32b53302
Committed by
Greg Kroah-Hartman
1 parent
27e267077c
Exists in
ti-linux-3.14.y
and in
2 other branches
DMA, CMA: fix possible memory leak
commit fe8eea4f4a3f299ef83ed090d5354698ebe4fda8 upstream. We should free memory for bitmap when we find zone mismatch, otherwise this memory will leak. Additionally, I copy code comment from PPC KVM's CMA code to inform why we need to check zone mis-match. Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Acked-by: Zhang Yanfei <zhangyanfei@cn.fujitsu.com> Reviewed-by: Michal Nazarewicz <mina86@mina86.com> Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Acked-by: Minchan Kim <minchan@kernel.org> Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> Cc: Marek Szyprowski <m.szyprowski@samsung.com> Cc: Michal Nazarewicz <mina86@mina86.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Gleb Natapov <gleb@kernel.org> Cc: Alexander Graf <agraf@suse.de> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Showing 1 changed file with 11 additions and 1 deletions Side-by-side Diff
drivers/base/dma-contiguous.c
... | ... | @@ -155,13 +155,23 @@ |
155 | 155 | base_pfn = pfn; |
156 | 156 | for (j = pageblock_nr_pages; j; --j, pfn++) { |
157 | 157 | WARN_ON_ONCE(!pfn_valid(pfn)); |
158 | + /* | |
159 | + * alloc_contig_range requires the pfn range | |
160 | + * specified to be in the same zone. Make this | |
161 | + * simple by forcing the entire CMA resv range | |
162 | + * to be in the same zone. | |
163 | + */ | |
158 | 164 | if (page_zone(pfn_to_page(pfn)) != zone) |
159 | - return -EINVAL; | |
165 | + goto err; | |
160 | 166 | } |
161 | 167 | init_cma_reserved_pageblock(pfn_to_page(base_pfn)); |
162 | 168 | } while (--i); |
163 | 169 | |
164 | 170 | return 0; |
171 | + | |
172 | +err: | |
173 | + kfree(cma->bitmap); | |
174 | + return -EINVAL; | |
165 | 175 | } |
166 | 176 | |
167 | 177 | static struct cma cma_areas[MAX_CMA_AREAS]; |