1. domain的本质是一个页表,1对1的关系
2. IOMMU_DOMAIN_UNMANAGED vs. IOMMU_DOMAIN_DMA
a. IOMMU_DOMAIN_UNMANAGED - DMA mappings managed by IOMMU-API user, used for VMs
b. IOMMU_DOMAIN_DMA - Internally used for DMA-API implementations. This flag allows IOMMU drivers to implement certain optimizations for these domains
IOMMU_DOMAIN_DMA对应default_domain
IOMMU_DOMAIN_UNMANAGED对应VFIO, 或者GPU自行创建的domain
多个domain解决的问题: 用户态发起的DMA,它自己在分配iova,直接设置下来,要求iommu就用这个iova,内核对这个设备做dma_map,也要分配iova, 两者(两个iova)冲突产生。
解决办法 就是:
VFIO:默认情况下,iommu(应该是DMA设备,而不是IOMMU)上会绑定一个default_domain,它具有IOMMU_DOMAIN_DMA属性,原来怎么弄就怎么弄,这时你可以调用dma_map()。但如果你要用VFIO,你就要(DMA设备)先detach原来的驱动,改用VFIO的驱动,VFIO就给你换一个domain,这个domain的属性是IOMMU_DOMAIN_UNMANAGED,之后你爱用哪个iova就用那个iova,你自己保证不会冲突就好,VFIO通过iommu_map(domain, iova, pa)来执行这种映射。
等你从VFIO上detach,把你的domain删除了,这个iommu(同上,应该是DMA设备,而不是IOMMU)就会恢复原来的default_domain,这样你就可以继续用你的dma API了。
这种情况下,你必须给你的设备选一种应用模式,非此即彼
vfio-pci [1]
vfio-pci 驱动中,把这个设备的io空间和iommu_group直接暴露到用户态
vfio_group是vfio对iommu_group的表述
The Intel IOMMU driver allocates a virtual address per domain. Each PCIE device ha