• Petr Tesarik's avatar
    swiotlb: fix slot alignment checks · 0eee5ae1
    Petr Tesarik authored
    Explicit alignment and page alignment are used only to calculate
    the stride, not when checking actual slot physical address.
    
    Originally, only page alignment was implemented, and that worked,
    because the whole SWIOTLB is allocated on a page boundary, so
    aligning the start index was sufficient to ensure a page-aligned
    slot.
    
    When commit 1f221a0d ("swiotlb: respect min_align_mask") added
    support for min_align_mask, the index could be incremented in the
    search loop, potentially finding an unaligned slot if minimum device
    alignment is between IO_TLB_SIZE and PAGE_SIZE.  The bug could go
    unnoticed, because the slot size is 2 KiB, and the most common page
    size is 4 KiB, so there is no alignment value in between.
    
    IIUC the intention has been to find a slot that conforms to all
    alignment constraints: device minimum alignment, an explicit
    alignment (given as function parameter) and optionally page
    alignment (if allocation size is >= PAGE_SIZE). The most
    restrictive mask can be trivially computed with logical AND. The
    rest can stay.
    
    Fixes: 1f221a0d ("swiotlb: respect min_align_mask")
    Fixes: e81e99ba ("swiotlb: Support aligned swiotlb buffers")
    Signed-off-by: default avatarPetr Tesarik <petr.tesarik.ext@huawei.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    0eee5ae1
swiotlb.c 28.8 KB