Re: [PATCH] swiotlb: suppress warning when __GFP_NOWARN is set v4

From: Christian KÃnig
Date: Thu Jan 04 2018 - 05:16:48 EST


Am 04.01.2018 um 10:53 schrieb Christoph Hellwig:
This seems to collide with my dma direct/swiotlb series posted recently.

+++ b/lib/swiotlb.c
@@ -490,11 +490,11 @@ static void swiotlb_bounce(phys_addr_t orig_addr, phys_addr_t tlb_addr,
}
}
-phys_addr_t swiotlb_tbl_map_single(struct device *hwdev,
- dma_addr_t tbl_dma_addr,
- phys_addr_t orig_addr, size_t size,
- enum dma_data_direction dir,
- unsigned long attrs)
+static phys_addr_t tbl_map_single(struct device *hwdev,
+ dma_addr_t tbl_dma_addr,
+ phys_addr_t orig_addr, size_t size,
+ enum dma_data_direction dir,
+ unsigned long attrs, bool warn)
We already have DMA_ATTR_NO_WARN which can be passed in attrs. Please
use it instead of reinventing it.

swiotlb_alloc_coherent(struct device *hwdev, size_t size,
dma_addr_t *dma_handle, gfp_t flags)
{
+ bool warn = !(flags & __GFP_NOWARN);
dma_addr_t dev_addr;
void *ret;
int order = get_order(size);
@@ -739,7 +750,7 @@ swiotlb_alloc_coherent(struct device *hwdev, size_t size,
* will grab memory from the lowest available address range.
*/
phys_addr_t paddr = map_single(hwdev, 0, size,
- DMA_FROM_DEVICE, 0);
+ DMA_FROM_DEVICE, 0, warn);
Note: in my above series swiotlb_alloc_coherent is going away, and
replaced with a swiotlb_alloc that takes a dma_attrs argument.

That's what I thought about as well, but this is a bug fix for stable kernels. So the changes should be as small as possible.

But using DMA_ATTR_NO_WARN is a good point, going to send a v5 which uses this instead.

Regards,
Christian.


Using that for passing the nowarn flag is the right way to go instead
of using __GFP_NOWARN.