ATS全称是Address Translation Service,顾名思义,就是一个地址翻译服务机制。PCIe下的ATS是以CPU为中心,PCIe总线上的各个设备可以通过ATS机制向主机申请未翻译地址对应的物理地址映射以及响应的属性、权限等信息。
一般地,在PCIe体系下,发起地址翻译请求的设备叫请求者,也叫client,而处理地址翻译请求的(即CPU)叫完成者,也叫home。因此,对于地址翻译请求的流程如下:
1、client有数据访问需求(或者是prefetching引入的需求);
2、client发出翻译请求给home侧,携带需要访问的虚拟地址空间块和响应属性、提示信息;
3、home侧进行翻译,之后返回翻译结果给client;
4、client在本地cache翻译结果;
5、client引擎发出数据访问,查本地cache,直接发出查完后的结果访问home侧;
6、home侧直接bypass TA,访问home本地内存。
ATS机制想要解决的问题(优势):
1、能够分担主机(CPU)侧的查表压力,特别是大带宽、大拓扑下的IO数据流,CPU侧的IOMMU/SMMU/VT-d的查表将会成为性能瓶颈,而ATS机制正好可以提供将这些查表压力卸载到不同的设备中,对整个系统实现“who consume it, who pay for it”。
2、对于IO设备往CPU的数据流,其IOMMU/SMMU/VT-d的查表性能在整个IO性能中显得极为关键,查表性能的好坏至今影响IO性能的好坏。而根据现今大量学术界和工业界的研究表明,决定查表性能的好坏的一个最为关键的点是TLB的预测。而像传统PCIe IO数据流,在CPU侧集中式做IOMMU/SMMU/VT-d的查表,对于其TLB的预测(prefetch)是很困难,极为不友好的。因为,很多不同workload的IO流汇聚到一点,对于TLB的预测的冲击很大,流之间的干扰很大,很难做出准确的预测,从而TLB的命中率始终做不到太高,从而影响IO性能。而ATS的机制恰好提供了一个TLB的预测卸载到源头去的机制,让用户(设备)自己根据自己自身的业务流来设计自己的预测策略,而且用户彼此之间的预测模型不会受到彼此的影响,从而大大提高了用户自己的预测的准确性。抽象来看,这时候的设备更像是CPU核,直接根据自身跑的workload来预测本地的TLB,从而提升预测性能,进而提升整系统的预测性能。
ATS机制就是一个分布式的地址翻译系统,对于异构架构的地址问题也起到了很好的支持效果。例如,NVIDIA和IBM最近搞的NVLINK互联CPU和GPU,其就是用了ATS来实现SVM,这个后续我想详细介绍一下。
当然,ATS也会带来如下两个比较严重的问题:
1、安全问题。也就是有了ATS后,设备会直接发出PA来访问CPU的内存空间,而CPU这边将不再查页表,从而也不再有地址访问权限的检查。因此,对于malicious设备,或者是被入侵的设备,又或者是设备自身设计的bug,其会发出PA访问那些其没有权限访问或者是不属于其的物理地址空间,从而带来系统的isolation的破坏,系统安全的威胁等安全问题。现有机制下,目前还没有解决办法。但,本人有专利可以解决,而且本人也有更好的机制可以解决,目前保密,暂时不能公布。本人的专利的话,后面有时间可以写一下。
2、无效化问题。也就是,在CPU侧被cache的页表发生变化(例如权限发生了变化,对应的PA需要回收SWAP等)的时候,此时CPU需要发出无效化指令给对应cache过的设备(ATC)来通知这件事,这会影响CPU回收页表/物理空间的性能。这就意味着CPU侧要实时跟踪页表被谁cache走了,维护这些信息也带来了成本的开销增长。
3、对设备的设计要求比较高,可以看到,ATS在某些时刻势必增加了延时。而为了减少甚至消除影响,就需要设备设计出具有良好的ATC机制,包括ATC的预测、地址翻译请求的长度、发送翻译请求的时机等,这里的设计空间都比较大,对设备的要求都比较高。
前面的问题1和2是系统需要解决的功能问题,后者3是一个趋势。我想象中的设备将会越来越智能,设备和CPU之间将会是点对点的平等计算地位,在异构体系下,它们是平等的计算关系。它们之间SVM、具有cache coherence等,从而第3看起来不是问题,而是趋势。
简单理解,CPU负担过重,瓶颈日益明显,将CPU中IOMMU/SMMU的对应表项卸载到EP,EP后续查自己的表,对地址进行翻译,bypass CPU的地址翻译。
Introduction to PCIe Page Request Interface
Introduction to PCIe Page Request Interface - L
Notes about guest memory pinning when direct assignment of I/O devices
Notes about guest memory pinning when direct assignment of I/O devices - L
PCI/ATS: Add PRI support for PCIe VF devices
[v4,4/7] PCI/ATS: Add PRI support for PCIe VF devices - Patchwork