• Petr Tesarik's avatar
    swiotlb: if swiotlb is full, fall back to a transient memory pool · 79636caa
    Petr Tesarik authored
    Try to allocate a transient memory pool if no suitable slots can be found
    and the respective SWIOTLB is allowed to grow. The transient pool is just
    enough big for this one bounce buffer. It is inserted into a per-device
    list of transient memory pools, and it is freed again when the bounce
    buffer is unmapped.
    
    Transient memory pools are kept in an RCU list. A memory barrier is
    required after adding a new entry, because any address within a transient
    buffer must be immediately recognized as belonging to the SWIOTLB, even if
    it is passed to another CPU.
    
    Deletion does not require any synchronization beyond RCU ordering
    guarantees. After a buffer is unmapped, its physical addresses may no
    longer be passed to the DMA API, so the memory range of the corresponding
    stale entry in the RCU list never matches. If the memory range gets
    allocated again, then it happens only after a RCU quiescent state.
    
    Since bounce buffers can now be allocated from different pools, add a
    parameter to swiotlb_alloc_pool() to let the caller know which memory pool
    is used. Add swiotlb_find_pool() to find the memory pool corresponding to
    an address. This function is now also used by is_swiotlb_buffer(), because
    a simple boundary check is no longer sufficient.
    
    The logic in swiotlb_alloc_tlb() is taken from __dma_direct_alloc_pages(),
    simplified and enhanced to use coherent memory pools if needed.
    
    Note that this is not the most efficient way to provide a bounce buffer,
    but when a DMA buffer can't be mapped, something may (and will) actually
    break. At that point it is better to make an allocation, even if it may be
    an expensive operation.
    Signed-off-by: default avatarPetr Tesarik <petr.tesarik.ext@huawei.com>
    Reviewed-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    79636caa
direct.c 17.6 KB