From 765e7b83f6702602fc9975816dc1a1a9ffce97f7 Mon Sep 17 00:00:00 2001 From: Vinayak Menon Date: Wed, 2 Sep 2020 11:26:13 +0530 Subject: [PATCH] kernel: dma: disallow altering logical map for non-CMA allocs DMA_ATTR_STRONGLY_ORDERED and DMA_ATTR_NO_KERNEL_MAPPING alters the logical mapping of allocated memory. This works only for CMA allocations where the pages are PAGE_SIZE mapped. Disallow fallback to buddy alloc if above attrs are set. Change-Id: I25c632d3c9179e22bc5061fd5f7e9ab6e7847322 Signed-off-by: Vinayak Menon --- kernel/dma/direct.c | 3 ++- kernel/dma/swiotlb.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) 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; }