Patch "swiotlb: Honour dma_alloc_coherent() alignment in swiotlb_alloc()" has been added to the 6.7-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    swiotlb: Honour dma_alloc_coherent() alignment in swiotlb_alloc()

to the 6.7-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     swiotlb-honour-dma_alloc_coherent-alignment-in-swiot.patch
and it can be found in the queue-6.7 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 3ad143d8fff1bc743dc2028b6abe23fbb52a1732
Author: Will Deacon <will@xxxxxxxxxx>
Date:   Fri Mar 8 15:28:26 2024 +0000

    swiotlb: Honour dma_alloc_coherent() alignment in swiotlb_alloc()
    
    [ Upstream commit cbf53074a528191df82b4dba1e3d21191102255e ]
    
    core-api/dma-api-howto.rst states the following properties of
    dma_alloc_coherent():
    
      | The CPU virtual address and the DMA address are both guaranteed to
      | be aligned to the smallest PAGE_SIZE order which is greater than or
      | equal to the requested size.
    
    However, swiotlb_alloc() passes zero for the 'alloc_align_mask'
    parameter of swiotlb_find_slots() and so this property is not upheld.
    Instead, allocations larger than a page are aligned to PAGE_SIZE,
    
    Calculate the mask corresponding to the page order suitable for holding
    the allocation and pass that to swiotlb_find_slots().
    
    Fixes: e81e99bacc9f ("swiotlb: Support aligned swiotlb buffers")
    Signed-off-by: Will Deacon <will@xxxxxxxxxx>
    Reviewed-by: Michael Kelley <mhklinux@xxxxxxxxxxx>
    Reviewed-by: Petr Tesarik <petr.tesarik1@xxxxxxxxxxxxxxxxxxx>
    Tested-by: Nicolin Chen <nicolinc@xxxxxxxxxx>
    Tested-by: Michael Kelley <mhklinux@xxxxxxxxxxx>
    Signed-off-by: Christoph Hellwig <hch@xxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index 8fba61069b84d..2d347685cf566 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -1610,12 +1610,14 @@ struct page *swiotlb_alloc(struct device *dev, size_t size)
 	struct io_tlb_mem *mem = dev->dma_io_tlb_mem;
 	struct io_tlb_pool *pool;
 	phys_addr_t tlb_addr;
+	unsigned int align;
 	int index;
 
 	if (!mem)
 		return NULL;
 
-	index = swiotlb_find_slots(dev, 0, size, 0, &pool);
+	align = (1 << (get_order(size) + PAGE_SHIFT)) - 1;
+	index = swiotlb_find_slots(dev, 0, size, align, &pool);
 	if (index == -1)
 		return NULL;
 




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux