The DMA coherent allocator needs to take bus limits into account for
picking the zone that the memory is allocated from.

Reported-by: Roger Quadros <[email protected]>
Signed-off-by: Christoph Hellwig <[email protected]>
Tested-by: Peter Ujfalusi <[email protected]>
Tested-by: Roger Quadros <[email protected]>
---
 arch/arm/mm/dma-mapping.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index 72ddc3d0f5eb..87aba505554a 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -658,7 +658,7 @@ static void *__dma_alloc(struct device *dev, size_t size, 
dma_addr_t *handle,
                         gfp_t gfp, pgprot_t prot, bool is_coherent,
                         unsigned long attrs, const void *caller)
 {
-       u64 mask = dev->coherent_dma_mask;
+       u64 mask = min_not_zero(dev->coherent_dma_mask, dev->bus_dma_limit);
        struct page *page = NULL;
        void *addr;
        bool allowblock, cma;
-- 
2.24.1

_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to