[root@master mdev]# vi Makefile
# SPDX-License-Identifier: GPL-2.0-only
mdev-y := mdev_core.o mdev_sysfs.o mdev_driver.o
obj-$(CONFIG_VFIO_MDEV) += mdev.o
obj-$(CONFIG_VFIO_MDEV_DEVICE) += vfio_mdev.o
如上,查看drivers/vfio/mdev/Makefile
可以發現,mdev(Mediated Device)實際上是由兩個而不是一個模塊構成。
他倆是怎么分工的?
[root@custom-16-126 mdev]# lsmod |grep -i mdev
vfio_mdev 12841 0
mdev 20336 1 vfio_mdev
vfio 32656 3 vfio_mdev,vfio_iommu_type1,vfio_pci
從上面的模塊可以看出,mdev模塊是通用模塊,雖然目前只有vfio_mdev來跟他適配,但設計來說,mdev可以看成bus總線,
比如pci總線,后面會有很多不同類型的pci總線設備接入,而vfio_mdev可以看做vfio驅動針對mdev總線的一種適配, vfio_mdev 與 vfio_pci的地位是一樣的。
vfio_mdev.ko
則是定義了mdev總線上的一種Driver,用來實現和VFIO的對接。
mdev出現的背景:
mdev的文檔可以參考vfio-mediated-device.txt,就是內核源碼自帶的,他主要解決的問題是,不支持sr-iov的設備,如何做到切分,也就是說,雖然物理上
不支持vf的切分,他通過mdev,可以時分復用的方式來實現虛擬化,這樣就實現了多個用戶態驅動“同時“ 操作一塊物理設備的能力。
我們為什么需要VFIO?一個原因是虛擬機經常時用直接設備訪問(“device assignment”)來獲得盡可能高的IO性能,
從設備和host的角度,這其實就是把VM變成了一個用戶態驅動,VM也因此獲得了這個IO設備的低延遲、高帶寬和全虛擬化原生(bare-metal)設備驅動的直接應用。
從gpu虛擬化的角度來看,我們怎么看待sr-iov的虛擬化與mdev-vfio的趨勢哪家會發展更好呢?
分片虛擬化不需要IOMMU硬件的支持。其只需要VFIO模塊添加type1 IOMMU的驅動,來通知host將要進行的DMA傳輸的GFN,VA等信息,並在Host端的mdev設備驅動層完成GFN到PFN的翻譯處理。
這個翻譯是通過pin_page然后建好映射的方式來實現的,可以理解為軟件層面上的IOMMU操作。
而AMD SRIOV與GPU passthrough方式下,IOMMU是必備組件。尤其IOMMU硬件完成GFN到PFN的地址轉換,分片虛擬化對於不具備sr-iov虛擬化的硬件是一個很好的解決方案,但是從里面的原理
可以看出,這樣方便了閉源的驅動加入到linux的家庭繼續存在,其中以英偉達為最,因為它只要實現了mdev驅動要求的幾個回調函數就行。既然是軟件層面實現的iommu,那么意味着速度上肯定會
比硬件上慢,其實sr-iov的硬件,現在出現更多在網卡側,比如智能網卡的產品落地,amd自從推出7150的顯卡支持sr-iov之后,幾年沒有見到新的產品來支持sr-iov,而反觀英偉達,借助mdev,將虛擬化做得風生水起。