Am Freitag, dem 15.11.2024 um 20:32 +0800 schrieb Sui Jingfeng: > The 'sg->offset' denotes the offset into a page in bytes, but under drm > subsystem, there has NO drivers that etnaviv can contact that actually > touch the 'offset' data member of SG anymore. This means that all DMA > addresses that sg_dma_address() gives us will be PAGE_SIZE aligned, in > other words, sg->offset will always equal to 0. > > But if 'sg->offset != 0' really could happens, then the current implement > might be not correct. Previous commits[1] fix the 'sg->offset == 0' cases > effectively, below is a simple illustration. > > One CPU page Another one CPU page > +----+----+----+----+ +----+----+----+----+ > |||||| | |||||| | > +----+----+----+----+ +----+----+----+----+ > ^ ^ ^ ^ > | | | | > | | .----------------' | > | | | .----------------' > | | | | > +----+ +----+ +----+ > |||||| |||||| | | GPU pages, each one is SZ_4K > +----+ +----+ +----+ > Correct implementation. > > -------------------------------------------------------------- > > One CPU page Another one CPU page > +----+----+----+----+ +----+----+----+----+ > |///////////////////| |||||| | > +----+----+----+----+ +----+----+----+----+ > ^ ^ ^ ^ > | | | | > | .------------|---' | > | | .-------|--------' > | | | | > | +----+ | > | |||||| | > | +----+ | > | IOVA | GPUVA range collision if use 'sg_dma_len(sg)' > +----+ +----+-------+ directly to map. Because 'sg_dma_len(sg)' is > |////|/|////////////| frequently larger than SZ_4K. > +----+ +----+-------+ > Wrong implementation. > > If we map the address range with respect to the size of the backing memory, > it will occupy GPUVA ranges that doesn't belong to. Which results in GPUVA > range collision for different buffers. > > Patch 0001 of this series give a fix, patch 0002 and 0003 > do trivial cleanup which eliminates unnecessary overheads. Thanks, applied to etnaviv/next. Regards, Lucas > v2 -> v3 > * Reword and improve commit message > v1 -> v2 > * Reword and fix typos and mistakes > > v1 Link: https://patchwork.freedesktop.org/series/140589/ > > Sui Jingfeng (3): > drm/etnaviv: Drop the offset in page manipulation > drm/etnaviv: Fix the debug log of the etnaviv_iommu_map() > drm/etnaviv: Improve VA, PA, SIZE alignment checking > > drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 26 +++++++++++--------------- > 1 file changed, 11 insertions(+), 15 deletions(-) >