pmd
pmd 的全称是Poll Mode Driver
是工作在用户态的驱动程序,dpdk的程序如果想要使用它,要在编译的时候链接相应的静态库
其工作的大体原理如下图
app需要链接pmd的lib以使用pmd提供的接口
pmd通过访问/dev/vfio下的文件与内核的vfio模块交互,通过文件描述符来响应中断,获取硬件配置信息,并将用户态创建出来的内存区域绑定到网卡的dma内存区域上,这样网卡的数据就可以直接在用户态获取了
这样的好处是
- 省去了中断上下文切换
- 省去了网卡数据在内核的一次拷贝
- 用户态驱动方便调试
当然,一旦网卡绑定了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