On Wed, Nov 25, 2020 at 07:03:34PM +0800, Yong Wu wrote: > On Tue, 2020-11-24 at 11:05 +0000, Will Deacon wrote: > > On Tue, Nov 24, 2020 at 05:24:44PM +0800, Yong Wu wrote: > > > On Mon, 2020-11-23 at 12:32 +0000, Will Deacon wrote: > > That said, maybe we could simplify this further by changing the loop bounds > > to be: > > > > for (addr = start; addr <= end; addr += pg_size) > > > > and checking: > > > > if (!phys_addr && addr != end) { > > map_size += pg_size; > > continue; > > } > > > > does that work? > > It works but I think we can not check iommu_iova_to_phys(domain, end). > We should add a "if", like: > > for (addr = start; addr <= end; addr += pg_size) { > ... > if (addr < end) { > phys_addr = iommu_iova_to_phys(domain, addr); > if (!phys_addr) { > map_size += pg_size; > continue; > } > } > ... >
Oh yes, you're right. > If you don't like this "if (addr < end)", then we have to add a "goto". > like this: > > > for (addr = start; addr <= end; addr += pg_size) { > phys_addr_t phys_addr; > > if (addr == end) > goto map_last; > > phys_addr = iommu_iova_to_phys(domain, addr); > if (!phys_addr) { > map_size += pg_size; > continue; > } > > map_last: > if (!map_size) > continue; > ret = iommu_map(domain, addr - map_size, > addr - map_size, map_size, entry->prot); I think it's cleared to invert this as you had before: if (map_size) ret = iommu_map(...); > Which one is better? The second one is easier to read. I'll stop making suggestions now, thanks. Will