Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 518a2f19 authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

dma-mapping: zero memory returned from dma_alloc_*



If we want to map memory from the DMA allocator to userspace it must be
zeroed at allocation time to prevent stale data leaks.   We already do
this on most common architectures, but some architectures don't do this
yet, fix them up, either by passing GFP_ZERO when we use the normal page
allocator or doing a manual memset otherwise.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> [m68k]
Acked-by: Sam Ravnborg <sam@ravnborg.org> [sparc]
parent 6c503d0d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -443,7 +443,7 @@ static void *alpha_pci_alloc_coherent(struct device *dev, size_t size,
	gfp &= ~GFP_DMA;

try_again:
	cpu_addr = (void *)__get_free_pages(gfp, order);
	cpu_addr = (void *)__get_free_pages(gfp | __GFP_ZERO, order);
	if (! cpu_addr) {
		printk(KERN_INFO "pci_alloc_consistent: "
		       "get_free_pages failed from %pf\n",
+1 −1
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
	 */
	BUG_ON(gfp & __GFP_HIGHMEM);

	page = alloc_pages(gfp, order);
	page = alloc_pages(gfp | __GFP_ZERO, order);
	if (!page)
		return NULL;

+4 −1
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ static void __free_dma_pages(u32 addr, int order)
void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
		gfp_t gfp, unsigned long attrs)
{
	void *ret;
	u32 paddr;
	int order;

@@ -94,7 +95,9 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
	if (!paddr)
		return NULL;

	return phys_to_virt(paddr);
	ret = phys_to_virt(paddr);
	memset(ret, 0, 1 << order);
	return ret;
}

/*
+1 −1
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
	size = PAGE_ALIGN(size);
	order = get_order(size);

	page = alloc_pages(flag, order);
	page = alloc_pages(flag | __GFP_ZERO, order);
	if (!page)
		return NULL;

+1 −1
Original line number Diff line number Diff line
@@ -81,7 +81,7 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
	size = PAGE_ALIGN(size);
	order = get_order(size);

	vaddr = __get_free_pages(gfp, order);
	vaddr = __get_free_pages(gfp | __GFP_ZERO, order);
	if (!vaddr)
		return NULL;

Loading