[PATCH RFC/RFT 1/5] ARM: dma-mapping: Add fallback normal page allocations

Nicolin Chen
2019-03-26T22:50:29Z

from normal area. So this patch adds fallback routines.

Signed-off-by: Nicolin Chen <nicoleotsuka@gmail.com>
---
arch/arm/mm/dma-mapping.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index 8a90f298af96..febaf637a25b 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -589,6 +589,8 @@ static void *__alloc_from_contiguous(struct device *dev, size_t size,
void *ptr = NULL;

page = dma_alloc_from_contiguous(dev, count, order, gfp & __GFP_NOWARN);
+ if (!page)
+ page = alloc_pages(gfp, order);
if (!page)
return NULL;

@@ -600,7 +602,8 @@ static void *__alloc_from_contiguous(struct device *dev, size_t size,
if (PageHighMem(page)) {
ptr = __dma_alloc_remap(page, size, GFP_KERNEL, prot, caller);
if (!ptr) {
- dma_release_from_contiguous(dev, page, count);
+ if (!dma_release_from_contiguous(dev, page, count))
+ __free_pages(page, get_order(size));
return NULL;
}
} else {
@@ -622,7 +625,8 @@ static void __free_from_contiguous(struct device *dev, struct page *page,
else
__dma_remap(page, size, PAGE_KERNEL);
}
- dma_release_from_contiguous(dev, page, size >> PAGE_SHIFT);
+ if (!dma_release_from_contiguous(dev, page, size >> PAGE_SHIFT))
+ __free_pages(page, get_order(size));
}

static inline pgprot_t __get_dma_pgprot(unsigned long attrs, pgprot_t prot)
@@ -1295,6 +1299,8 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size,

page = dma_alloc_from_contiguous(dev, count, order,
gfp & __GFP_NOWARN);
+ if (!page)
+ page = alloc_pages(gfp, order);
if (!page)
goto error;

@@ -1369,7 +1375,8 @@ static int __iommu_free_buffer(struct device *dev, struct page **pages,
int i;

if (attrs & DMA_ATTR_FORCE_CONTIGUOUS) {
- dma_release_from_contiguous(dev, pages[0], count);
+ if (!dma_release_from_contiguous(dev, pages[0], count))
+ __free_pages(page[0], get_order(size));
} else {
for (i = 0; i < count; i++)
if (pages[i])