解决VFIO透传问题

0. 相关配置

首先说明一下目前设备中网卡透传大概操作流程:

  1. 从主机中把网卡与驱动解绑定,比如:网卡使用的是igb驱动,首先解绑定
  2. 网卡绑定vfio-pci虚拟化驱动,通过绑定vfio驱动后,网卡才能给虚拟机使用

如果要实现以上方式,系统需要进行如下配置:

  1. BIOS中开启VT-d直通模式,建议开启SRIOV模式
  2. 内核模块中增加vfio和IOMMU相关模块

进行了如上设置以后,在设备启动以后,可以看到加载的vfio相关模块
在这里插入图片描述

1. 问题现象

产品中使用vfio进行设备直通,在设备直通后,虚拟机启动时,启动报错:failed to set iommu for container,或者 Device initialization failed

2. 解决方案

造成以上问题的原因是因为设备不支持IOMMU 中断重映射,那怎么判断设备是否支持中断重映射呢,如下所示:
在这里插入图片描述
当 ecap (0xf020fe → …​1110) 的第 3 位是 1 时,意味着 IOMMU 支持中断重映射。如上所示,应该支持中断重映射。

如果由于硬件不支持中断重新映射而导致传递失败,则可以考虑allow_unsafe_interrupts在虚拟机受信任时启用该选项。此选项默认是不启动的。

[root@localhost cloud]# cat /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts 
N
[root@localhost cloud]#

具体开启方式如下:
在grub.cfg文件中增加 vfio_iommu_type1.allow_unsafe_interrupts = 1 的设置

3. vfio透传

与Legacy KVM Device Assignment(使用pci-stub driver) 相比, VFIO(Virtual Function IO[1]) 最大的改进就是隔离了设备之间的DMA和中断, 以及对IOMMU Group的支持, 从而有了更好的安全性。 IOMMU Group可以认为是对PCI设备的分组, 每个group里面的设备被视作IOMMU可以操作的最小整体; 换句话说, 同一个IOMMU Group里的设备不可以分配给不同的客户机。 在以前的Legacy KVM Device Assignment中, 并不会检查这一点, 而后面的操作却注定是失败的。 新的VFIO会检查并及时报错。
另外, 新的VFIO架构也做到了平台无关, 有更好的可移植性。

查看有哪些IOMMU Group以及所属的设备:

[root@localhost cloud]# ls /sys/kernel/iommu_groups/
0  10  12  14  16  18  2   21  23  25  27  29  30  32  34  36  38  4   41  43  45  47  49  6  8
1  11  13  15  17  19  20  22  24  26  28  3   31  33  35  37  39  40  42  44  46  48  5   7  9
[root@localhost cloud]# 

4. 参考资料

虚拟机直接IO原理与架构

配置 SR-IOV 网络

Intel VT-d(3)- 中断重映射

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在osgEarth中解决模型透明问题,可以采用以下两种方式: 1. 使用深度排序 深度排序是一种常用的解决模型透明问题的方法。在渲染透明模型时,需要按照模型的深度从后往前渲染,这样才能保证前面的模型不会遮挡后面的模型。osgEarth中提供了DepthOffsetNode这个节点,可以用于设置渲染时的深度偏移量,从而实现深度排序。 例如,可以将需要渲染的节点加入到DepthOffsetNode中,然后设置合适的深度偏移量,即可实现深度排序。示例代码如下: ``` osg::ref_ptr<osgEarth::Util::DepthOffsetNode> depthOffsetNode = new osgEarth::Util::DepthOffsetNode; depthOffsetNode->addChild(model); depthOffsetNode->setDepthOffset(-1.0f, -1.0f); root->addChild(depthOffsetNode); ``` 在上述代码中,我们创建了一个DepthOffsetNode节点,并将需要渲染的模型节点model添加到其中。然后,我们设置了深度偏移量为(-1.0f, -1.0f),表示在渲染透明模型时,深度值需要减去一个较小的偏移量,以保证透明模型能够正确地进行深度排序。最后,我们将DepthOffsetNode节点添加到场景根节点root中即可。 2. 使用Alpha测试 另一种解决模型透明问题的方法是使用Alpha测试。Alpha测试是一种在渲染透明模型时,根据像素的Alpha值来决定是否进行绘制的方法。在osgEarth中,可以使用StateSet来设置Alpha测试相关的状态,例如设置Alpha测试函数和Alpha测试值等。 示例代码如下: ``` osg::ref_ptr<osg::StateSet> stateSet = model->getOrCreateStateSet(); stateSet->setAttributeAndModes(new osg::AlphaFunc(osg::AlphaFunc::GREATER, 0.5f), osg::StateAttribute::ON); stateSet->setMode(GL_BLEND, osg::StateAttribute::ON); ``` 在上述代码中,我们首先获取或创建模型的StateSet,然后设置Alpha测试函数为GREATER,Alpha测试值为0.5f。这表示只有像素的Alpha值大于0.5f时,才会进行绘制。最后,我们使用setMode()函数将混合模式设置为ON,表示需要进行混合处理。 总之,这两种方法都可以解决模型透明问题,在具体应用中可以根据情况选择。需要注意的是,深度排序需要考虑场景中所有透明物体的深度关系,而Alpha测试只是根据像素的Alpha值进行判断,因此在场景比较复杂的情况下,深度排序可能更加合适。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值