将晦涩难懂的技术讲的通俗易懂
分类: linux
2023-05-14 17:11:07
我们知道iommu的一个关键功能就是做dma remapping,类似cpu的mmu功能,而类比cpu mmu为了加快地址转换引入了tlb,iommu也也有类似技术,叫做iotlb。
由于iotlb的特殊性(tlb只服务于cpu,并且同时只有设备访问。而iotlb则会有多个i/o设备同时访问),pci express{banned}最佳近有一个草案,叫做ats(address translation services)。主要思想就是为了加快转换,避免集中式的iotlb带来性能上的影响,在每个pci express设备中加入转换用的cache。
ats的思想是:每个pci express设备都拥有自己的atc,这样就无需去查询iotlb,因而可以缓解iotlb的压力,提高访存性能。如下图所示。
这里需要说明的是ta是iommu的一部分,它主要负责iova的转换以及通过atpt来判断某个设备是否有权限access 某段内存;另外,从上图可以看到支持atc 功能的设备在拓扑结构上可分为三类:一类是直接链接到rc上,一类是直接链接到root port上,{banned}最佳后一类是通过switch链接到rp上。后两类拓扑结构如果pcie 设备要enable ats功能则root port必须要支持ats功能。
当pcie device的atc无法完成地址映射时,此刻就需要pcie device发送ats request给ta。ta完成地址映射后,会将结果返还给pcie device,这样,pcie device中的atc就有地址映射项了。如下图
当ta中对内存地址更改之后,会发送ats invalidate request给pcie device,device会取消该映射项,并将结果返还给ta。如下图:
下面我们看一下如果支持ats需要哪些条件,软件侧的使能。ats的enable是在intel iommu侧执行的,相关代码如下:
点击(此处)折叠或打开
即使能ats需要三个条件:
1.ecap_dev_iotlb_support(iommu->ecap)// 即判断iommu 硬件 ecap的dt位是否为1
2. pci_ats_supported(pdev) // 判断pcie 设备有没有ats capability
3. dmar_find_matched_atsr_unit(pdev) //如果该pcie设备直接挂在rc上则返回true,如果该设备挂在rp上则判断rp是否支持ats。
如果上面三个条件都为真时则表示这个设备是可以eanble ats的,然后在iommu_enable_dev_iotlb 函数里面会调用pci_enable_ats 在设备侧使能ats feature(将ats control register 第15位置1)。
ats之于iommu就相当于tlb之于cpu,其起到的作用不言自明。但是目前支持ats的设备并不多,一方面是因为大部分业务场景下对这一块感知并不明显,那部分感知比较明显的比如hpc,机器学习这些业务主要依赖gpu,nv针对这些limit也早就做了优化比如gpudirect等;还有就是在设备上增加cache也是需要成本的,本来设备上的sram也没有多大,另外就是非虚拟化场景intel iommu也支持pt的方式从而避免了iova的转换的开销。
但是随着云原生和serverless的出现,可能就不一样了。比如一台128核的icelake(后面的spr有256核){banned}最佳多能启动512台kata容器,按照每个容器一块磁盘一张网卡那么在dpu架构上也是需要1024块设备的,这种场景下对iommu侧的冲击就比较大了,此时ats的作用就比较明显了。
参考: