dpdk rte_eth_dev_count_avail()返回0 问题解决记录

pmd

pmd 的全称是Poll Mode Driver
是工作在用户态的驱动程序,dpdk的程序如果想要使用它,要在编译的时候链接相应的静态库

其工作的大体原理如下图

在这里插入图片描述

app需要链接pmd的lib以使用pmd提供的接口
pmd通过访问/dev/vfio下的文件与内核的vfio模块交互,通过文件描述符来响应中断,获取硬件配置信息,并将用户态创建出来的内存区域绑定到网卡的dma内存区域上,这样网卡的数据就可以直接在用户态获取了

这样的好处是

  1. 省去了中断上下文切换
  2. 省去了网卡数据在内核的一次拷贝
  3. 用户态驱动方便调试

当然,一旦网卡绑定了vfio驱动,内核协议栈也就不能工作了,当然也有比较高级的网卡可以支持同时允许vfio驱动和原始kernel驱动的
dpdk官方文档对于Bifurcated Driver的描述

大体背景描述完毕,下面说说我遇到的问题

我在一个带有网卡的独立小开发板子上安装了一块独立网卡,并将其绑定到了vfio驱动上

Network devices using DPDK-compatible driver
============================================
0000:02:00.0 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller 8161' drv=vfio-pci unused=r8169

Network devices using kernel driver
===================================
0000:07:00.0 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller 8168' if=enp7s0 drv=r8169 unused=vfio-pci *Active*

于是我有了两个工作在不同驱动的网卡

但是当我运行dpdk官方example的时候报找不到可用的网卡

sudo ./dpdk-ethtool
[sudo] password for wangli:
EAL: Detected CPU lcores: 20
EAL: Detected NUMA nodes: 1
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'VA'
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
Number of NICs: 0
EAL: Error - exiting with code: 1
  Cause: No available NIC ports!

几经查找发现是dpdk并没有支持Realtek网卡的pmd驱动,也就是说虽然网卡已经被接管,但是当前链接的所有pmd(dpdk提供了多种网卡的pmd)都没办法和realtek正确沟通。

最后发现dpdk支持使用基于libpcap的纯软件pmd启动

首先要安装libpcap-dev

在我的ubuntu上可以这样

sudo apt-get install libpcap-dev

然后重新使用meson 重新配置一下dpdk的编译选项

这是因为,在安装了libpcap-dev,让meson重新探测一下环境,就可以使libpcap pmd功能启用

 meson -Dexamples=all build_with_examples

这里的build_with_examples是输出目录
-Dexamples=all表示需要构建所有的示例

之后我们可以在运行dpdk app的时候加上 --vdev参数启动libpcap pmd功能

./dpdk-ethtool --vdev 'net_pcap0,iface=enp7s0'

这时候上面的图就要变一下了
在这里插入图片描述

可以看到,实际上除了能够体验pmd提供的接口,其他的加速功能都已经消失了

注意在此之前要将网卡的驱动恢复为默认kernel驱动

sudo ./dpdk-devbind.py --bind=r8169 0000:02:00.0

这里r8169是我的realtek网卡的默认驱动

最终效果

sudo ./dpdk-ethtool --vdev 'net_pcap0,iface=enp7s0'
EAL: Detected CPU lcores: 20
EAL: Detected NUMA nodes: 1
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'VA'
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
Number of NICs: 1
Init port 0..
EthApp>

参考文献

stackoverflow 为什么rte_eth_dev_count_avail返回0

dpdk支持网卡类型(intel)

Libpcap and Ring Based Poll Mode Drivers

VFIO介绍

IOMMU VFIO概述

【dpdk】使用libpcap-PMD驱动收发包

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值