On Thu, Nov 19, 2020 at 02:18:30PM +0800, Yong Wu wrote: > This patchset is to improve tlb flushing performance in iommu_map/unmap > for MediaTek IOMMU. > > For iommu_map, currently MediaTek IOMMU use IO_PGTABLE_QUIRK_TLBI_ON_MAP > to do tlb_flush for each a memory chunk. this is so unnecessary. we could > improve it by tlb flushing one time at the end of iommu_map. > > For iommu_unmap, currently we have already improve this performance by > gather. But the current gather should take care its granule size. if the > granule size is different, it will do tlb flush and gather again. Our HW > don't care about granule size. thus I add a flag(granule_ignore) for this > case. > > After this patchset, we could achieve only tlb flushing once in iommu_map > and iommu_unmap. > > Regardless of sg, for each a segment, I did a simple test: > > size = 20 * SZ_1M; > /* the worst case, all are 4k mapping. */ > ret = iommu_map(domain, 0x5bb02000, 0x123f1000, size, IOMMU_READ); > iommu_unmap(domain, 0x5bb02000, size); > > This is the comparing time(unit is us): > original-time after-improve > map-20M 59943 2347 > unmap-20M 264 36 > > This patchset also flush tlb once in the iommu_map_sg case. > > patch [1/6][2/6][3/6] are for map while the others are for unmap. > > change note: > v2: Refactor all the code. > base on v5.10-rc1.
Robin -- please can you take a look at this series? I'm not sure I'll have time to get to it at the moment and you understand how this stuff is supposed to work. Cheers, Will

