aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm64
diff options
context:
space:
mode:
authorMarek Szyprowski <m.szyprowski@samsung.com>2015-04-23 07:46:16 -0400
committerWill Deacon <will.deacon@arm.com>2015-04-27 06:39:50 -0400
commit6829e274a623187c24f7cfc0e3d35f25d087fcc5 (patch)
treea6ca873b29878ee7bc8c328af8a64bae0f49a37e /arch/arm64
parent6544e67bfb1bf55bcf3c0f6b37631917e9acfb74 (diff)
arm64: dma-mapping: always clear allocated buffers
Buffers allocated by dma_alloc_coherent() are always zeroed on Alpha, ARM (32bit), MIPS, PowerPC, x86/x86_64 and probably other architectures. It turned out that some drivers rely on this 'feature'. Allocated buffer might be also exposed to userspace with dma_mmap() call, so clearing it is desired from security point of view to avoid exposing random memory to userspace. This patch unifies dma_alloc_coherent() behavior on ARM64 architecture with other implementations by unconditionally zeroing allocated buffer. Cc: <stable@vger.kernel.org> # v3.14+ Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm64')
-rw-r--r--arch/arm64/mm/dma-mapping.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
index ef7d112f5ce0..e0f14ee26b68 100644
--- a/arch/arm64/mm/dma-mapping.c
+++ b/arch/arm64/mm/dma-mapping.c
@@ -67,8 +67,7 @@ static void *__alloc_from_pool(size_t size, struct page **ret_page, gfp_t flags)
67 67
68 *ret_page = phys_to_page(phys); 68 *ret_page = phys_to_page(phys);
69 ptr = (void *)val; 69 ptr = (void *)val;
70 if (flags & __GFP_ZERO) 70 memset(ptr, 0, size);
71 memset(ptr, 0, size);
72 } 71 }
73 72
74 return ptr; 73 return ptr;
@@ -113,8 +112,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size,
113 112
114 *dma_handle = phys_to_dma(dev, page_to_phys(page)); 113 *dma_handle = phys_to_dma(dev, page_to_phys(page));
115 addr = page_address(page); 114 addr = page_address(page);
116 if (flags & __GFP_ZERO) 115 memset(addr, 0, size);
117 memset(addr, 0, size);
118 return addr; 116 return addr;
119 } else { 117 } else {
120 return swiotlb_alloc_coherent(dev, size, dma_handle, flags); 118 return swiotlb_alloc_coherent(dev, size, dma_handle, flags);