IOVA原理扩展介绍:
在Linux内核的I/O虚拟地址(IOVA)分配机制中存在两个影响高吞吐量I/O性能的问题
问题1:原有IOVA分配器在分配时可能需要对已分配的IOVA范围进行线性搜索,这种操作效率低下,尤其在大规模并发I/O请求场景下会成为性能瓶颈。
问题2:用于同步IOVA分配操作的红黑树自旋锁(rbtree spinlock)在多CPU环境下容易产生争用(contended),进一步降低系统的并行处理能力。
为了解决这两个问题,引入了一个新的API,该API支持在每个CPU核心上缓存已分配的IOVA范围。这样,CPU在分配或释放IOVA时无需频繁访问全局的、带锁保护的IOVA分配器。这种模式可以有效地减少对全局资源的竞争。改进了IOMMU和IOVA地址分配功能,引入了基于每个CPU缓存的IOVA分配机制,提高大规模并发DMA操作的性能和效率。
通过在原有的rbtree分配器之上添加缓存层,仍能保持IOVA在IO虚拟地址空间内的紧密排列特性,这对于降低IOMMU页表的使用量至关重要。
为了控制缓存大小的合理性,设定了一些限制条件:
-
只有Size<=128 KB的IOVA范围会被缓存。
-
每个CPU核心最多只能缓存32 MB的IOVA范围。
-
全局缓存容量被限制在4 MB以内。
这样一来,通过对IOVA分配机制的优化,能够在保证IOMMU资源高效利用的同时,有效提升系统在高并发I/O场景下的性能表现。