]> www.infradead.org Git - users/hch/misc.git/commit
block: add scatterlist-less DMA mapping helpers
authorChristoph Hellwig <hch@lst.de>
Sun, 27 Oct 2024 14:21:57 +0000 (16:21 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 17 Jun 2025 05:14:04 +0000 (07:14 +0200)
commit3879ef2f843e5456834ece8cc5f3fc68e354ffd9
tree3a86ea49f037b143b4b253ac039a41770a965e86
parent44fb7eda2d0ad60a614fb77a7e1a64fa22ea7d62
block: add scatterlist-less DMA mapping helpers

Add a new blk_rq_dma_map / blk_rq_dma_unmap pair that does away with
the wasteful scatterlist structure.  Instead it uses the mapping iterator
to either add segments to the IOVA for IOMMU operations, or just maps
them one by one for the direct mapping.  For the IOMMU case instead of
a scatterlist with an entry for each segment, only a single [dma_addr,len]
pair needs to be stored for processing a request, and for the direct
mapping the per-segment allocation shrinks from
[page,offset,len,dma_addr,dma_len] to just [dma_addr,len].

One big difference to the scatterlist API, which could be considered
downside, is that the IOVA collapsing only works when the driver sets
a virt_boundary that matches the IOMMU granule.  For NVMe this is done
already so it works perfectly.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
block/blk-mq-dma.c
include/linux/blk-mq-dma.h [new file with mode: 0644]