FM10420(fm10k) DPDK RX 队列随着 dmesg 上的 FUM_BAD_VF_QACCESS 变空

FM10420(fm10k) DPDK RX Queues become empty along with FUM_BAD_VF_QACCESS on dmesg

我正在使用多个 rx/tx 队列开发自己的 dpdk 应用程序。我的应用程序 运行 在 Intel 82599ES NIC 上完全没问题。但是,我想 运行 我在 FM10420 上的应用程序。我使用 FM10420 虚拟功能 (VF),因为我的 PF 需要绑定到 fm10k 驱动程序以控制交换结构。 运行在 FM10420 VF 上设置我的应用程序后,RX 队列在几秒钟后变空,主机上出现以下两个 dmesg,

[Nov23 10:41] fm10k 0000:b1:00.0: THI_MAL_DIS_Q_FAULT Address: 0xf0 SpecInfo: 0x0 Func: 00.1
[  +0.000251] fm10k 0000:b1:00.0: FUM_BAD_VF_QACCESS Address: 0x2f014 SpecInfo: 0x0 Func: 00.1

根据fm10k驱动的readme,

Known Issues/Troubleshooting
----------------------------

FUM_BAD_VF_QACCESS error on port reset
--------------------------------------
A FUM_BAD_VF_QACCESS error may be written to the message buffer when a command
or application triggers a reset on the port's physical function (PF). When the
PF is reset, any bound virtual functions (VFs) can no longer access their
queues. This behavior is expected. No user intervention is required. After the
PF reset is complete, the VFs will be able to access their queues normally.

这种行为是正常的,当 PF 被重置触发并且 VF 变得无法访问它们的队列时会发生这种情况。 同样在 https://doc.dpdk.org/guides/nics/fm10k.html 上提到了开关重启,如下所示,

19.3.2. Support for Switch Restart

For FM10000 multi host based design a DPDK app running in the VM or host needs to be aware of
 the switch’s state since it may undergo a quit-restart. When the switch goes down the DPDK app
 will receive a LSC event indicating link status down, and the app should stop the worker 
threads that are polling on the Rx/Tx queues. When switch comes up, a LSC event indicating 
LINK_UP is sent to the app, which can then restart the FM10000 port to resume network 
processing.

因此我猜测是主机接口或开关以某种方式触发了重置 activity 而我的应用程序无法检测到它。我尝试使用 rte_eth_dev_callback_register() 函数为我的 dpdk 端口注册 LSC 中断,但无法在我的回调函数上注册任何事件。

但是,我可以使用以下命令在这台带有 FM10420 VF 的主机上完美地 运行 测试 pmd,利用多个队列(也没有 dmesg)。因此我认为 testpmd 已经以某种方式解决了这个问题,但是我在 testpmd 源代码上找不到任何可以链接到这个问题的线索。

sudo ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xffff -n 4 -- -i --rxq=4 --txq=4 --nb-cores=8

我的问题是如何解决这个问题,我应该从哪里开始? (顺便说一句,我尝试在 dpdk 上启用调试模式但没有成功)

Kernel Version - 4.4.0-190-generic
DPDK Version - 17.05.2
VF PCI Addresses - 0000:af:00.1, 0000:b1:00.1
PF PCI Addresses - 0000:af:00.0, 0000:b1:00.0
VF Driver - igb_uio
PF Driver - fm10k
PF Driver Version - 0.26.1 
Iommu settings - iommu=pt intel_iommu=on

在使用 example/skeleton 和我自己的 dpdk 应用程序进行了一些测试后,我发现问题在于使用 rte_eth_tx_buffer(); 将我的数据包缓冲到 TX 队列。我已将其替换为 rte_eth_tx_burst();,它将以单个数据包突发的形式传输我的数据包。但是,我想这可能会影响我的 TX 性能,但我还没有进行任何性能测试。

我不知道 fm10k 对 rte_eth_tx_buffer(); 有什么问题。 (可能是因为 FM10K does not support HW offload for VF?)

更新:

我发现了我的错误。我使用 rte_eth_tx_buffer_init(tx_buffer, 1)) 而不是 rte_eth_tx_buffer_init(tx_buffer, MAX_PKT_BURST)),这实际上只初始化了 1 个 TX 缓冲区。我不确定在其他 NIC 上为什么不是问题,但 FM10420 肯定是。