diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c index 1d2f147f737d..590bbd40e788 100644 --- a/kernel/dma/direct.c +++ b/kernel/dma/direct.c @@ -85,7 +85,8 @@ again: page = NULL; } } - if (!page) + if (!page && !(attrs & (DMA_ATTR_STRONGLY_ORDERED | + DMA_ATTR_NO_KERNEL_MAPPING))) page = alloc_pages_node(dev_to_node(dev), gfp, page_order); if (page && !dma_coherent_ok(dev, page_to_phys(page), size)) { diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c index 2a8c41f12d45..1dc1ec0d9383 100644 --- a/kernel/dma/swiotlb.c +++ b/kernel/dma/swiotlb.c @@ -1026,7 +1026,8 @@ void *swiotlb_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp |= __GFP_NOWARN; vaddr = dma_direct_alloc(dev, size, dma_handle, gfp, attrs); - if (!vaddr) + if (!vaddr && !(attrs & (DMA_ATTR_STRONGLY_ORDERED | + DMA_ATTR_NO_KERNEL_MAPPING))) vaddr = swiotlb_alloc_buffer(dev, size, dma_handle, attrs); return vaddr; }