On Fri, Jan 04, 2019 at 10:35:43PM +0000, Jason Gunthorpe wrote:
Commit 2db76d7c3c6d ("lib/scatterlist: sg_page_iter: support sg lists w/o backing pages") introduced the sg_page_iter_dma_address() function without providing a way to use it in the general case. If the sg_dma_len is not equal to the dma_length callers cannot safely use the for_each_sg_page/sg_page_iter_dma_address combination.
Resolve this API mistake by providing a DMA specific iterator, for_each_sg_dma_page(), that uses the right length so sg_page_iter_dma_address() works as expected with all sglists. A new iterator type is introduced to provide compile-time safety against wrongly mixing accessors and iterators.
[..]
+/*
- sg page iterator for DMA addresses
- This is the same as sg_page_iter however you can call
- sg_page_iter_dma_address(@dma_iter) to get the page's DMA
- address. sg_page_iter_page() cannot be called on this iterator.
- */
Does it make sense to have a variant of sg_page_iter_page() to get the page descriptor with this dma_iter? This can be used when walking DMA-mapped SG lists with for_each_sg_dma_page.
+struct sg_dma_page_iter {
- struct sg_page_iter base;
+};