summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2018-12-14 03:00:40 -0500
committerChristoph Hellwig <hch@lst.de>2018-12-20 02:13:52 -0500
commit518a2f1925c3165befbf06b75e07636549d92c1c (patch)
tree629130481205f514709c3cc84a2f5debed28f8cd
parent6c503d0d88db9d57c1dc4c87175c94766b6a6c61 (diff)
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: Christoph Hellwig <hch@lst.de> Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> [m68k] Acked-by: Sam Ravnborg <sam@ravnborg.org> [sparc]
-rw-r--r--arch/alpha/kernel/pci_iommu.c2
-rw-r--r--arch/arc/mm/dma.c2
-rw-r--r--arch/c6x/mm/dma-coherent.c5
-rw-r--r--arch/m68k/kernel/dma.c2
-rw-r--r--arch/microblaze/mm/consistent.c2
-rw-r--r--arch/openrisc/kernel/dma.c2
-rw-r--r--arch/parisc/kernel/pci-dma.c4
-rw-r--r--arch/s390/pci/pci_dma.c2
-rw-r--r--arch/sparc/kernel/ioport.c2
-rw-r--r--arch/sparc/mm/io-unit.c2
-rw-r--r--arch/sparc/mm/iommu.c2
-rw-r--r--arch/xtensa/kernel/pci-dma.c2
-rw-r--r--drivers/misc/mic/host/mic_boot.c2
-rw-r--r--kernel/dma/virt.c2
14 files changed, 18 insertions, 15 deletions
diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c
index e1716e0d92fd..aa0f50d0f823 100644
--- a/arch/alpha/kernel/pci_iommu.c
+++ b/arch/alpha/kernel/pci_iommu.c
@@ -443,7 +443,7 @@ static void *alpha_pci_alloc_coherent(struct device *dev, size_t size,
443 gfp &= ~GFP_DMA; 443 gfp &= ~GFP_DMA;
444 444
445try_again: 445try_again:
446 cpu_addr = (void *)__get_free_pages(gfp, order); 446 cpu_addr = (void *)__get_free_pages(gfp | __GFP_ZERO, order);
447 if (! cpu_addr) { 447 if (! cpu_addr) {
448 printk(KERN_INFO "pci_alloc_consistent: " 448 printk(KERN_INFO "pci_alloc_consistent: "
449 "get_free_pages failed from %pf\n", 449 "get_free_pages failed from %pf\n",
diff --git a/arch/arc/mm/dma.c b/arch/arc/mm/dma.c
index db203ff69ccf..1525ac00fd02 100644
--- a/arch/arc/mm/dma.c
+++ b/arch/arc/mm/dma.c
@@ -33,7 +33,7 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
33 */ 33 */
34 BUG_ON(gfp & __GFP_HIGHMEM); 34 BUG_ON(gfp & __GFP_HIGHMEM);
35 35
36 page = alloc_pages(gfp, order); 36 page = alloc_pages(gfp | __GFP_ZERO, order);
37 if (!page) 37 if (!page)
38 return NULL; 38 return NULL;
39 39
diff --git a/arch/c6x/mm/dma-coherent.c b/arch/c6x/mm/dma-coherent.c
index 01305c787201..75b79571732c 100644
--- a/arch/c6x/mm/dma-coherent.c
+++ b/arch/c6x/mm/dma-coherent.c
@@ -78,6 +78,7 @@ static void __free_dma_pages(u32 addr, int order)
78void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, 78void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
79 gfp_t gfp, unsigned long attrs) 79 gfp_t gfp, unsigned long attrs)
80{ 80{
81 void *ret;
81 u32 paddr; 82 u32 paddr;
82 int order; 83 int order;
83 84
@@ -94,7 +95,9 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
94 if (!paddr) 95 if (!paddr)
95 return NULL; 96 return NULL;
96 97
97 return phys_to_virt(paddr); 98 ret = phys_to_virt(paddr);
99 memset(ret, 0, 1 << order);
100 return ret;
98} 101}
99 102
100/* 103/*
diff --git a/arch/m68k/kernel/dma.c b/arch/m68k/kernel/dma.c
index e99993c57d6b..b4aa853051bd 100644
--- a/arch/m68k/kernel/dma.c
+++ b/arch/m68k/kernel/dma.c
@@ -32,7 +32,7 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
32 size = PAGE_ALIGN(size); 32 size = PAGE_ALIGN(size);
33 order = get_order(size); 33 order = get_order(size);
34 34
35 page = alloc_pages(flag, order); 35 page = alloc_pages(flag | __GFP_ZERO, order);
36 if (!page) 36 if (!page)
37 return NULL; 37 return NULL;
38 38
diff --git a/arch/microblaze/mm/consistent.c b/arch/microblaze/mm/consistent.c
index 45e0a1aa9357..3002cbca3059 100644
--- a/arch/microblaze/mm/consistent.c
+++ b/arch/microblaze/mm/consistent.c
@@ -81,7 +81,7 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
81 size = PAGE_ALIGN(size); 81 size = PAGE_ALIGN(size);
82 order = get_order(size); 82 order = get_order(size);
83 83
84 vaddr = __get_free_pages(gfp, order); 84 vaddr = __get_free_pages(gfp | __GFP_ZERO, order);
85 if (!vaddr) 85 if (!vaddr)
86 return NULL; 86 return NULL;
87 87
diff --git a/arch/openrisc/kernel/dma.c b/arch/openrisc/kernel/dma.c
index 159336adfa2f..f79457cb3741 100644
--- a/arch/openrisc/kernel/dma.c
+++ b/arch/openrisc/kernel/dma.c
@@ -89,7 +89,7 @@ arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
89 .mm = &init_mm 89 .mm = &init_mm
90 }; 90 };
91 91
92 page = alloc_pages_exact(size, gfp); 92 page = alloc_pages_exact(size, gfp | __GFP_ZERO);
93 if (!page) 93 if (!page)
94 return NULL; 94 return NULL;
95 95
diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c
index 04c48f1ef3fb..239162355b58 100644
--- a/arch/parisc/kernel/pci-dma.c
+++ b/arch/parisc/kernel/pci-dma.c
@@ -404,7 +404,7 @@ static void *pcxl_dma_alloc(struct device *dev, size_t size,
404 order = get_order(size); 404 order = get_order(size);
405 size = 1 << (order + PAGE_SHIFT); 405 size = 1 << (order + PAGE_SHIFT);
406 vaddr = pcxl_alloc_range(size); 406 vaddr = pcxl_alloc_range(size);
407 paddr = __get_free_pages(flag, order); 407 paddr = __get_free_pages(flag | __GFP_ZERO, order);
408 flush_kernel_dcache_range(paddr, size); 408 flush_kernel_dcache_range(paddr, size);
409 paddr = __pa(paddr); 409 paddr = __pa(paddr);
410 map_uncached_pages(vaddr, size, paddr); 410 map_uncached_pages(vaddr, size, paddr);
@@ -429,7 +429,7 @@ static void *pcx_dma_alloc(struct device *dev, size_t size,
429 if ((attrs & DMA_ATTR_NON_CONSISTENT) == 0) 429 if ((attrs & DMA_ATTR_NON_CONSISTENT) == 0)
430 return NULL; 430 return NULL;
431 431
432 addr = (void *)__get_free_pages(flag, get_order(size)); 432 addr = (void *)__get_free_pages(flag | __GFP_ZERO, get_order(size));
433 if (addr) 433 if (addr)
434 *dma_handle = (dma_addr_t)virt_to_phys(addr); 434 *dma_handle = (dma_addr_t)virt_to_phys(addr);
435 435
diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c
index 346ba382193a..9e52d1527f71 100644
--- a/arch/s390/pci/pci_dma.c
+++ b/arch/s390/pci/pci_dma.c
@@ -404,7 +404,7 @@ static void *s390_dma_alloc(struct device *dev, size_t size,
404 dma_addr_t map; 404 dma_addr_t map;
405 405
406 size = PAGE_ALIGN(size); 406 size = PAGE_ALIGN(size);
407 page = alloc_pages(flag, get_order(size)); 407 page = alloc_pages(flag | __GFP_ZERO, get_order(size));
408 if (!page) 408 if (!page)
409 return NULL; 409 return NULL;
410 410
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c
index baa235652c27..f89603855f1e 100644
--- a/arch/sparc/kernel/ioport.c
+++ b/arch/sparc/kernel/ioport.c
@@ -325,7 +325,7 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
325 return NULL; 325 return NULL;
326 326
327 size = PAGE_ALIGN(size); 327 size = PAGE_ALIGN(size);
328 va = (void *) __get_free_pages(gfp, get_order(size)); 328 va = (void *) __get_free_pages(gfp | __GFP_ZERO, get_order(size));
329 if (!va) { 329 if (!va) {
330 printk("%s: no %zd pages\n", __func__, size >> PAGE_SHIFT); 330 printk("%s: no %zd pages\n", __func__, size >> PAGE_SHIFT);
331 return NULL; 331 return NULL;
diff --git a/arch/sparc/mm/io-unit.c b/arch/sparc/mm/io-unit.c
index 91be13935d40..f770ee7229d8 100644
--- a/arch/sparc/mm/io-unit.c
+++ b/arch/sparc/mm/io-unit.c
@@ -224,7 +224,7 @@ static void *iounit_alloc(struct device *dev, size_t len,
224 return NULL; 224 return NULL;
225 225
226 len = PAGE_ALIGN(len); 226 len = PAGE_ALIGN(len);
227 va = __get_free_pages(gfp, get_order(len)); 227 va = __get_free_pages(gfp | __GFP_ZERO, get_order(len));
228 if (!va) 228 if (!va)
229 return NULL; 229 return NULL;
230 230
diff --git a/arch/sparc/mm/iommu.c b/arch/sparc/mm/iommu.c
index fb771a634452..e8d5d73ca40d 100644
--- a/arch/sparc/mm/iommu.c
+++ b/arch/sparc/mm/iommu.c
@@ -344,7 +344,7 @@ static void *sbus_iommu_alloc(struct device *dev, size_t len,
344 return NULL; 344 return NULL;
345 345
346 len = PAGE_ALIGN(len); 346 len = PAGE_ALIGN(len);
347 va = __get_free_pages(gfp, get_order(len)); 347 va = __get_free_pages(gfp | __GFP_ZERO, get_order(len));
348 if (va == 0) 348 if (va == 0)
349 return NULL; 349 return NULL;
350 350
diff --git a/arch/xtensa/kernel/pci-dma.c b/arch/xtensa/kernel/pci-dma.c
index 1fc138b6bc0a..9171bff76fc4 100644
--- a/arch/xtensa/kernel/pci-dma.c
+++ b/arch/xtensa/kernel/pci-dma.c
@@ -160,7 +160,7 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
160 flag & __GFP_NOWARN); 160 flag & __GFP_NOWARN);
161 161
162 if (!page) 162 if (!page)
163 page = alloc_pages(flag, get_order(size)); 163 page = alloc_pages(flag | __GFP_ZERO, get_order(size));
164 164
165 if (!page) 165 if (!page)
166 return NULL; 166 return NULL;
diff --git a/drivers/misc/mic/host/mic_boot.c b/drivers/misc/mic/host/mic_boot.c
index c327985c9523..6479435ac96b 100644
--- a/drivers/misc/mic/host/mic_boot.c
+++ b/drivers/misc/mic/host/mic_boot.c
@@ -149,7 +149,7 @@ static void *__mic_dma_alloc(struct device *dev, size_t size,
149 struct scif_hw_dev *scdev = dev_get_drvdata(dev); 149 struct scif_hw_dev *scdev = dev_get_drvdata(dev);
150 struct mic_device *mdev = scdev_to_mdev(scdev); 150 struct mic_device *mdev = scdev_to_mdev(scdev);
151 dma_addr_t tmp; 151 dma_addr_t tmp;
152 void *va = kmalloc(size, gfp); 152 void *va = kmalloc(size, gfp | __GFP_ZERO);
153 153
154 if (va) { 154 if (va) {
155 tmp = mic_map_single(mdev, va, size); 155 tmp = mic_map_single(mdev, va, size);
diff --git a/kernel/dma/virt.c b/kernel/dma/virt.c
index 631ddec4b60a..ebe128833af7 100644
--- a/kernel/dma/virt.c
+++ b/kernel/dma/virt.c
@@ -13,7 +13,7 @@ static void *dma_virt_alloc(struct device *dev, size_t size,
13{ 13{
14 void *ret; 14 void *ret;
15 15
16 ret = (void *)__get_free_pages(gfp, get_order(size)); 16 ret = (void *)__get_free_pages(gfp | __GFP_ZERO, get_order(size));
17 if (ret) 17 if (ret)
18 *dma_handle = (uintptr_t)ret; 18 *dma_handle = (uintptr_t)ret;
19 return ret; 19 return ret;