irpas技术客

VFIO代码分析(2)VFIO-PCI驱动1_linux解码者_vfio-pci

未知 1918

?????????VFIO-PCI驱动作为PCIE驱动,在原来的PCIE驱动卸载后,加载VFIO-PCI驱动,与内核之前扫描到的PCIE设备匹配,触发vfio_pci_probe(),进行本驱动的初始化。该驱动提供了用户态访问PCIE设备的配置空间/BAR空间/中断等资源接口,对应于上图中Device API(代码主要在drivers/vfio/vfio-pci.c)。

????????之前VFIO-PCI驱动为公共驱动,所有的设备(无论是网卡还是加速器)都是使用该驱动,但是前段时间MLX和HISI在上传热迁移时遇到一些问题,发现需要有部分实现不属于公共部分,因此VFIO-PCI驱动框架作修改,将其拆成两部分,公共部分vfio-pci-core和驱动部分vfio-pci,这个驱动部分仍属于公共驱动,若某个模块需要实现自己的驱动,仍基于公共部分设计自己的驱动。

1?VFIO-PCI probe函数分析

????????根据设备驱动模型,VFIO-PCI驱动与VFIO设备匹配触发vfio_pci_probe()函数,调用关系如下:

????????上述为VFIO-PCI驱动的基本步骤,分别都是调用VFIO-PCI-CORE导出的公共函数,分别分配vfio_pci_core_device设备,初始化该设备,并最终注册设备。

????????其中函数vfio_pci_core_register_device()注册该设备,对该设备分配vfio_group,并与该设备关联。

根据不同情况,调用vfio_assign_device_set()将vfio_device放到到一组中;调用vfio_pci_vf_init()设置bus notifier回调,回调函数为vfio_pci_bus_notifier;调用vfio_register_group_dev()分配vfio_group,并将vfio_device与vfio_group关联。 2?VFIO PCI Group操作回调vfio_group_ops

????????QEMU通过Group API获取内核中vfio_group相关的信息并进行相关的设置。这里仅介绍unlocked_ioctl回调。

(1).unlocked_ioctl = vfio_group_fops_unl_ioctl

????????QEMU对Group API的调用都是通过上述函数实现,对不同的API处理如下:

其中VFIO_GROUP_SET_STATUS用于获取group是否可见,是否设置group->container;

VFIO_GROUP_SET_CONTAINER用于将vfio_group与vfio_container关联;

VFIO_GROUP_UNSET_CONTAINER用于将vfio_group与vfio_container取消关联;

VFIO_GROUP_SET_DEVICE_FD用于分配fd,将vfio_device与fd关联。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #vfiopci