On Tue, Jan 11, 2022 at 04:26:48PM -0400, Jason Gunthorpe wrote: > What I did in RDMA was make an iterator rdma_umem_for_each_dma_block() > > The driver passes in the page size it wants and the iterator breaks up > the SGL into that size. > > So, eg on a 16k page size system the SGL would be full of 16K stuff, > but the driver only support 4k and so the iterator hands out 4 pages > for each SGL entry. > > All the drivers use this to build their DMA lists and tables, it works > really well. The block layer also has the equivalent functionality by setting the virt_boundary value in the queue_limits. This is needed for NVMe PRPs and RDMA drivers.