1. vfio-iommu为何是group粒度的,而不是device粒度的?
vfio group的概念其实继承自iommu group,那问题就转换为iommu的最小隔离单位是如何定义的。
1.1 设备之间是如何通过iommu实现互相隔离的呢?只需要iommu给不同设备提供独立的iova页表即可,这样不同设备 通过iova页表 映射到的hpa就不会互相覆盖了。也就达到了隔离的作用。
那么如果有多个设备共用同一套iova页表的情况(如pcie总线中的PCIe-to-PCI bridge会mask其下挂载的所有传统pci设备,这些被隐藏的pci设备都是复用该bridge的requester id与IOMMU交互<传统pci设备并不像pcie一样使用requester id来标记transaction>。那经过context table获取到的context entry是同一个,即iova页表基地址是同一个。再经过页表映射到的hpa也会是一样的),那iommu就无法“隔离”开这些设备。
- 这时候需要引入一个新的概念,如group,将这些设备 捆绑到一个组里,共存式使用,比如都绑定到vfio-pci驱动(未必需要都透传给vm)。
1.2 另外,再考虑设备P2P与IOMMU混用的场景。如设备A的某个地址既可以通过IOMMU将iova翻译成hpa,也可以通过P2P匹配到另外一个设备B的地址,而设备B的地址已经通过MMIO也map到相同的hpa。那么pci拓扑结构里的bridge这些interconnect一般会做一些数据通路的优化,选择直接走P2P而不是IOMMU。这种绕过IOMMU的方式就没办法做隔离了。
- 正好IOMMU group也将这种情况考虑进去了,会将支持 无需地址翻译即P2P DMA 的设备捆绑到一个组里。