]> www.infradead.org Git - users/hch/misc.git/commit
nvme-pci: convert the data mapping blk_rq_dma_map
authorChristoph Hellwig <hch@lst.de>
Thu, 5 Jun 2025 07:24:02 +0000 (09:24 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 10 Jun 2025 05:00:46 +0000 (07:00 +0200)
commitacf99665e4da2bc397a2fdaf1b86febbd3d0915f
treed25791d7df28a12b1692d1d85262677660a56cfc
parentab502f7c9d58244dc8cb17e08ca29fc442f73735
nvme-pci: convert the data mapping blk_rq_dma_map

Use the blk_rq_dma_map API to DMA map requests instead of scatterlists.
This removes the need to allocate a scatterlist covering every segment,
and thus the overall transfer length limit based on the scatterlist
allocation.

Instead the DMA mapping is done by iterating the bio_vec chain in the
request directly.  The unmap is handled differently depending on how
we mapped:

 - when using an IOMMU only a single IOVA is used, and it is stored in
   iova_state
 - for direct mappings that don't use swiotlb and are cache coherent no
   unmap is needed at all
 - for direct mappings that are not cache coherent or use swiotlb, the
   physical addresses are rebuild from the PRPs or SGL segments

The latter unfortunately adds a fair amount of code to the driver, but
it is code not used in the fast path.

The conversion only covers the data mapping path, and still uses a
scatterlist for the multi-segment metadata case.  I plan to convert that
as soon as we have good test coverage for the multi-segment metadata
path.

Thanks to Chaitanya Kulkarni for an initial attempt at a new DMA API
conversion for nvme-pci, Kanchan Joshi for bringing back the single
segment optimization, Leon Romanovsky for shepherding this through a
gazillion rebases and Nitesh Shetty for various improvements.

Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/pci.c