[PATCH 2/2] dma-direct: Try reallocation with GFP_DMA32 if possible

From: Takashi Iwai
Date: Thu Apr 12 2018 - 03:53:48 EST


This patch adds a similar fallback reallocation with GFP_DMA32 as
we've done with GFP_DMA. The condition is that the coherent mask is
smaller than 64bit (i.e. some address limitation), and neither GFP_DMA
nor GFP_DMA32 is set beforehand.

Signed-off-by: Takashi Iwai <tiwai@xxxxxxx>
---
lib/dma-direct.c | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/lib/dma-direct.c b/lib/dma-direct.c
index 191f96453419..b3cabf06ce90 100644
--- a/lib/dma-direct.c
+++ b/lib/dma-direct.c
@@ -84,6 +84,12 @@ void *dma_direct_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
__free_pages(page, page_order);
page = NULL;

+ if (GFP_DMA32 && dev->coherent_dma_mask < DMA_BIT_MASK(64) &&
+ !(gfp & (GFP_DMA32 | GFP_DMA))) {
+ gfp |= GFP_DMA32;
+ goto again;
+ }
+
if (GFP_DMA && dev->coherent_dma_mask < DMA_BIT_MASK(32) &&
!(gfp & GFP_DMA)) {
gfp = (gfp & ~GFP_DMA32) | GFP_DMA;
--
2.16.3


--Multipart_Thu_Apr_12_10:03:56_2018-1--