[Bug求助]阿里云服务器virtio找不到vendor capability

阿里云服务器virtio找不到vendor capability

背景

目前需要将DragonOS移植到云服务器,当前进度卡在无法挂载硬盘的panic:

经过几次二分查找可知,问题出现在virtio磁盘的probe过程。在云服务器上使用的virtio磁盘是:

它属于 pci设备,pci设备一般都有capabilities,以链表的形式存储在配置空间中,以配置空间设置头指针的方式给出。

正常的流程

我们的代码要求virtio设备至少需要有msix中断capability(id=0x11)以及vendor specific capability(id=0x09),否则设备的PciTransport将无法成功生成。

如果没有msix

没有msix,则下面的函数无法成功运行从而触发panic:
transport_pci.rs (revision 2eab6dd743e94a86a685f1f3c01e599adf86610a) - OpenGrok cross reference for /DragonOS/kernel/src/driver/virtio/transport_pci.rs
该函数的功能是选择设备的中断属性,理论上说pci设备都会实现三个中断属性的一种,所以一般不会没有msix

如果没有vendor specific

没有vendor specific的话,就无法配置virtio设备(没有common cfg,会触发MissingCommonConfig异常):
transport_pci.rs (revision 2eab6dd743e94a86a685f1f3c01e599adf86610a) - OpenGrok cross reference for /DragonOS/kernel/src/driver/virtio/transport_pci.rs
这个for循环是依靠vendor specific属性配置virtio设备的,它的逻辑是遍历pci设备的capabilities,如果某个capabilities的id是vendor specific,则它就进行配置,否则跳过。

如果没有vendor specific,则这个for循环会全部跳过,导致virtio设备的一些必要属性没有配置,触发后面的错误:
transport_pci.rs (revision 2eab6dd743e94a86a685f1f3c01e599adf86610a) - OpenGrok cross reference for /DragonOS/kernel/src/driver/virtio/transport_pci.rs

这里会导致common_cfg为空,从而触发异常(后果就是virtio设备的PciTransport结构初始化失败)


阿里云的virtio

目前我尝试使用阿里云的服务器进行测试,但是阿里云服务器提供的ECS非常抽象,它提供的virtio设备都仅有msix capability,没有vendor specific capability:


(在Capabilities一栏中,仅有一个Capability,即MSI-X)
所以DragonOS在阿里云服务器上启动时,就会产生上面提出的问题,而且当前无法解决

4 个赞

PCIDevice看起来是PCIe指定的属性,会不会在pci设备中是另一套处理方法