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

From: Christoph Hellwig
Date: Thu Jan 04 2018 - 04:53:31 EST


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.

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