|
@@ -586,7 +586,7 @@ phys_addr_t swiotlb_tbl_map_single(struct device *hwdev,
|
|
|
|
|
|
not_found:
|
|
not_found:
|
|
spin_unlock_irqrestore(&io_tlb_lock, flags);
|
|
spin_unlock_irqrestore(&io_tlb_lock, flags);
|
|
- if (printk_ratelimit())
|
|
|
|
|
|
+ if (!(attrs & DMA_ATTR_NO_WARN) && printk_ratelimit())
|
|
dev_warn(hwdev, "swiotlb buffer is full (sz: %zd bytes)\n", size);
|
|
dev_warn(hwdev, "swiotlb buffer is full (sz: %zd bytes)\n", size);
|
|
return SWIOTLB_MAP_ERROR;
|
|
return SWIOTLB_MAP_ERROR;
|
|
found:
|
|
found:
|
|
@@ -713,6 +713,7 @@ void *
|
|
swiotlb_alloc_coherent(struct device *hwdev, size_t size,
|
|
swiotlb_alloc_coherent(struct device *hwdev, size_t size,
|
|
dma_addr_t *dma_handle, gfp_t flags)
|
|
dma_addr_t *dma_handle, gfp_t flags)
|
|
{
|
|
{
|
|
|
|
+ bool warn = !(flags & __GFP_NOWARN);
|
|
dma_addr_t dev_addr;
|
|
dma_addr_t dev_addr;
|
|
void *ret;
|
|
void *ret;
|
|
int order = get_order(size);
|
|
int order = get_order(size);
|
|
@@ -738,8 +739,8 @@ swiotlb_alloc_coherent(struct device *hwdev, size_t size,
|
|
* GFP_DMA memory; fall back on map_single(), which
|
|
* GFP_DMA memory; fall back on map_single(), which
|
|
* will grab memory from the lowest available address range.
|
|
* will grab memory from the lowest available address range.
|
|
*/
|
|
*/
|
|
- phys_addr_t paddr = map_single(hwdev, 0, size,
|
|
|
|
- DMA_FROM_DEVICE, 0);
|
|
|
|
|
|
+ phys_addr_t paddr = map_single(hwdev, 0, size, DMA_FROM_DEVICE,
|
|
|
|
+ warn ? 0 : DMA_ATTR_NO_WARN);
|
|
if (paddr == SWIOTLB_MAP_ERROR)
|
|
if (paddr == SWIOTLB_MAP_ERROR)
|
|
goto err_warn;
|
|
goto err_warn;
|
|
|
|
|
|
@@ -769,9 +770,11 @@ swiotlb_alloc_coherent(struct device *hwdev, size_t size,
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
err_warn:
|
|
err_warn:
|
|
- pr_warn("swiotlb: coherent allocation failed for device %s size=%zu\n",
|
|
|
|
- dev_name(hwdev), size);
|
|
|
|
- dump_stack();
|
|
|
|
|
|
+ if (warn && printk_ratelimit()) {
|
|
|
|
+ pr_warn("swiotlb: coherent allocation failed for device %s size=%zu\n",
|
|
|
|
+ dev_name(hwdev), size);
|
|
|
|
+ dump_stack();
|
|
|
|
+ }
|
|
|
|
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|