将晦涩难懂的技术讲的通俗易懂
分类: 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的作用就比较明显了。
参考: