On Thu, Mar 12, 2020 at 11:31:35AM +0100, Christian König wrote: > But how should we then deal with all the existing interfaces which already > take a scatterlist/sg_table ? > > The whole DMA-buf design and a lot of drivers are build around > scatterlist/sg_table and to me that actually makes quite a lot of sense. > Replace them with a saner interface that doesn't take a scatterlist. At very least for new functionality like peer to peer DMA, but especially this code would also benefit from a general move away from the scatterlist. > For TTM I'm also trying for quite a while to just nuke the manual > dma_address arrays we have and switch over to scatterlist/sg_table. Which is a move in the wrong direction. > I mean we could come up with a new structure for this, but to me that just > looks like reinventing the wheel. Especially since drivers need to be able > to handle both I/O to system memory and I/O to PCIe BARs. The structure for holding the struct page side of the scatterlist is called struct bio_vec, so far mostly used by the block and networking code. The structure for holding dma addresses doesn't really exist in a generic form, but would be an array of these structures: struct dma_sg { dma_addr_t addr; u32 len; }; Keeping them separate is important as most IOMMU drivers will return less entries than you can feed them. E.g. if your input boundaries are 4k aligned you will usually just get a single IOVA entry back. I will soon also have a dma mapping interface that will take advantage of that fact.