On Thu, 20 Feb 2020, Robin Murphy wrote: > > > > > Add CONFIG_IOMMU_LIMIT_IOVA_ALIGNMENT to limit the alignment of > > > > > IOVAs to some desired PAGE_SIZE order, specified by > > > > > CONFIG_IOMMU_IOVA_ALIGNMENT. This helps reduce the impact of > > > > > fragmentation caused by the current IOVA alignment scheme, and > > > > > gives better IOVA space utilization. > > > > > > > > Even if the general change did prove reasonable, this IOVA allocator is > > > > not > > > > owned by the DMA API, so entirely removing the option of strict > > > > size-alignment feels a bit uncomfortable. Personally I'd replace the > > > > bool > > > > argument with an actual alignment value to at least hand the authority > > > > out > > > > to individual callers. > > > > > > > > Furthermore, even in DMA API terms, is anyone really ever going to > > > > bother > > > > tuning that config? Since iommu-dma is supposed to be a transparent > > > > layer, > > > > arguably it shouldn't behave unnecessarily differently from CMA, so > > > > simply > > > > piggy-backing off CONFIG_CMA_ALIGNMENT would seem logical. > > > > > > Agreed, reusing CONFIG_CMA_ALIGNMENT makes a lot of sense here as callers > > > relying on natural alignment of DMA buffer allocations already have to > > > deal with that limitation. We could fix it as an optional parameter at > > > init time (init_iova_domain()), and have the DMA IOMMU implementation > > > pass it in there. > > > > > > > My concern with using CONFIG_CMA_ALIGNMENT alignment is that for us this > > would either involve further fragmenting our CMA regions (moving our CMA > > max alignment from 1MB to max 2MB) or losing so of our 2MB IOVA block > > mappings (changing our IOVA max alignment form 2MB to 1MB). > > > > At least for us CMA allocations are often not DMA mapped into stage 1 page > > tables so moving the CMA max alignment to 2MB in our case would, I think, > > only provide the disadvantage of having to increase the size our CMA > > regions to accommodate this large alignment (which isnąt optimal for > > memory utilization since CMA regions can't satisfy unmovable page > > allocations). > > > > As an alternative would it be possible for the dma-iommu layer to use the > > size of the allocation and the domain pgsize_bitmap field to pick a max > > IOVA alignment, which it can pass in for that IOVA allocation, which will > > maximize block mappings but not waste IOVA space? > > Given that we already have DMA_ATTR_ALOC_SINGLE_PAGES for video drivers and > suchlike that know enough to know they want "large buffer" allocation > behaviour, would it suffice to have a similar attribute that says "I'm not too > fussed about alignment"? That way there's no visible change for anyone who > doesn't opt in and might be relying on the existing behaviour, intentionally > or otherwise. > > Then if necessary, the implementation can consider both flags together to > decide whether to try to round down to the next block size or just shove it in > anywhere. > This should work for us. My only concern is that many of our users would be using DMA-Buf memory, so DMA mapping would be done using dma_buf_map_attachment which I believe still doesn't support specifying any DMA attributes. I had previously tried to get support added upstream but wasn't successful. https://lkml.org/lkml/2019/1/18/826 https://lkml.org/lkml/2019/1/18/827 But perhaps this new attribute will provide enough justification for DMA attributes (in some form, either explicitly or via flags) to be supported via dma_buf_map_attachment. Liam Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project