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; > +}; > + >