[daily][dpdk] 内核模块(网卡驱动)无法卸载

本文介绍了在尝试卸载igb_uio驱动时遇到的问题及解决方法。由于内核的引用计数未被清除,导致驱动无法正常卸载。文中提供了一个解决方案:通过设置CONFIG_MODULE_FORCE_UNLOAD参数来强制卸载驱动,但这需要重新编译内核。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

由于程序的异常退出, 内核的引用计数没有被清除(我猜的). 所以驱动不能被卸载掉, 强制也不行.

如下:

[root@localhost ~]# insmod /opt/scorpion/KingKong/kmod/igb_uio.ko 
insmod: error inserting '/opt/scorpion/KingKong/kmod/igb_uio.ko': -1 File exists
You have new mail in /var/spool/mail/root
[root@localhost ~]# rmmod /opt/scorpion/KingKong/kmod/igb_uio.ko [root@localhost ~]# insmod /opt/scorpion/KingKong/kmod/igb_uio.ko 

ERROR: Module igb_uio is in use
[root@localhost ~]# rmmod -f /opt/scorpion/KingKong/kmod/igb_uio.ko 
ERROR: Removing 'igb_uio': Resource temporarily unavailable
insmod: error inserting '/opt/scorpion/KingKong/kmod/igb_uio.ko': -1 File exists
You have new mail in /var/spool/mail/root
[root@localhost ~]# rmmod /opt/scorpion/KingKong/kmod/igb_uio.ko 
ERROR: Module igb_uio is in use
[root@localhost ~]# rmmod -f /opt/scorpion/KingKong/kmod/igb_uio.ko 
ERROR: Removing 'igb_uio': Resource temporarily unavailable

 

因为 -f 参数实际上是没有起作用的. 可以修改内存参数使其其作用, 这样就能强制卸载了.

这个参数的名字是: 

CONFIG_MODULE_FORCE_UNLOAD
[root@T185 ~]# cat /boot/config-3.4.68-1.el6.x86_64  |grep FORCE_UNLOAD
# CONFIG_MODULE_FORCE_UNLOAD is not set
[root@T185 ~]# 

 

不过需要重新编译内核才行.

 

转载于:https://www.cnblogs.com/hugetong/p/7605926.html

<think>我们正在处理用户关于如何使用DPDKtestpmd测试网卡VLAN卸载功能的问题。根据提供的引用内容,我们可以总结出以下关键点:1.DPDKPMD(PollMode Driver)在发送报文时会检查mbuf中的VLAN设置,并在报文离开网络端口时插入VLAN Tag(引用[1])。2.硬件VLAN卸载可以避免软件插入VLANTag带来的CPU开销(引用[2])。 3.不同网卡支持的硬件卸载功能不同,包括VLAN相关功能(引用[3])。4.DPDK应用程序通过rte_eth_dev_start启动设备,并设置收发函数,然后通过rte_eth_tx_burst和rte_eth_rx_burst进行数据收发(引用[4])。 用户需求:使用testpmd测试网卡的VLAN卸载功能。根据引用[1]中提到的testpmd命令:```testpmd>tx_vlan set(port_id)vlan_id[,vlan_id_outer]``` 这个命令用于设置发送报文的VLANTag。此外,我们还需要考虑接收端对VLAN报文的处理。为了测试VLAN卸载功能,我们需要进行以下步骤:1.启动testpmd,并配置端口。2.设置发送端的VLANTag(使用tx_vlan命令)。3.设置接收端对VLAN报文的过滤(如果需要)。 4.启动流量并观察结果。 具体步骤:###步骤1:启动testpmd使用如下命令启动testpmd(假设使用两个端口进行测试):```bash./dpdk-testpmd-l0-3 ---i--portmask=0x3``` 这里,`-l`指定核心列表,`-- -i`表示交互模式,`--portmask`指定使用的端口掩码(这里使用两个端口)。###步骤2:设置发送端VLAN在testpmd交互界面中,使用`tx_vlan set`命令为指定端口设置VLAN ID。例如,为端口0设置内层VLANID为100,外层VLAN ID为200(双层VLAN):```testpmd>tx_vlan set0100,200```如果只需要单层VLAN,可以只设置一个VLAN ID: ```testpmd>tx_vlan set0100```###步骤3:设置接收端VLAN过滤(可选)如果接收端需要过滤特定VLAN的报文,可以使用`vlan set`命令。例如,在端口1上设置接收VLAN ID为100的报文: ```testpmd>vlanset filter1ontestpmd>vlansetpvid1100``` 或者,也可以使用`rx_vlanadd`命令添加允许接收的VLAN ID: ```testpmd>rx_vlan add1100```###步骤4:启动流量并观察启动端口:``` testpmd> start``` 然后开始发送流量,例如从端口0发送到端口1: ```testpmd>set fwd mactestpmd>set txpkts64testpmd>start tx_first``` 使用`showport statsall`查看端口统计信息,确认接收端口是否收到带VLANTag的报文。###验证VLAN卸载为了验证VLAN卸载功能是否生效,我们可以: 1.在发送端,我们通过设置`tx_vlan`,硬件应该自动插入VLANTag,而不需要软件参与。我们可以通过抓包工具(如tcpdump)在物理端口上抓包,查看发送出去的报文是否带有正确的VLANTag。2.在接收端,如果设置了VLAN过滤,只有带有指定VLAN Tag的报文才会被接收,否则会被丢弃。我们可以通过统计信息来确认。 注意:在运行testpmd之前,需要确保网卡驱动支持VLAN卸载,并且已经正确绑定到DPDK。 ###引用说明-设置发送VLAN的命令参考了引用[1]。 -VLAN卸载的优势和原理参考了引用[2]。-网卡支持的功能参考了引用[3](但具体命令不在引用中,我们使用了testpmd的标准命令)。- DPDK应用程序的启动和收发流程参考了引用[4]。###相关问题根据用户的问题,我们可以生成以下相关问题: 1.如何确认网卡是否支持VLAN卸载? 2.在DPDK中,除了testpmd,还有其他方法测试VLAN卸载吗? 3.如何配置双层VLAN(QinQ)的卸载?4.VLAN卸载功能在性能测试中能带来多大的提升?</think>### 如何使用 DPDK testpmd 测试网卡 VLAN 卸载功能 #### 一、环境准备 1. **确认硬件支持** 执行 `lspci -v` 检查网卡型号,确认支持 VLAN 卸载(参考引用[3]的硬件支持表)。 ```bash lspci -v | grep -i ethernet ``` 2. **绑定网卡DPDK** 使用 `dpdk-devbind.py` 将网卡绑定到 `vfio-pci` 或 `uio_pci_generic` 驱动: ```bash ./dpdk-devbind.py -b vfio-pci 0000:01:00.0 ``` #### 二、配置 testpmd 1. **启动 testpmd** 启用 VLAN 卸载功能(`tx-offload` 和 `rx-offload`): ```bash ./dpdk-testpmd -l 0-3 -n 4 -- -i \ --portmask=0x1 \ --tx-offloads=0x8000 \ # 启用 VLAN 插入卸载 --rx-offloads=0x8000 # 启用 VLAN 剥离卸载 ``` 2. **设置 VLAN 参数** 在 testpmd 交互界面中: ```bash testpmd> tx_vlan set 0 100 # 端口0设置内层VLAN ID=100 testpmd> tx_vlan set 0 200,300 # 设置双层VLAN(外层200/内层300) testpmd> rx_vlan add 0 100 # 端口0允许接收VLAN=100的报文 testpmd> vlan set strip 0 on # 启用接收端VLAN剥离 ``` #### 三、流量测试与验证 1. **启动流量转发** ```bash testpmd> set fwd mac # 设置MAC转发模式 testpmd> start tx_first # 开始发送流量 ``` 2. **验证卸载效果** - **发送端验证**: 通过抓包工具(如 `tcpdump`)检查物理端口报文,确认硬件自动添加了 VLAN Tag(避免软件拷贝,引用[2])。 ```bash tcpdump -i enp1s0 -nn -v vlan ``` - **接收端验证**: 使用 `show port stats 0` 查看统计信息,确认 VLAN 报文被正确接收和剥离。 #### 四、关键原理说明 1. **VLAN 卸载优势** - 硬件自动插入/剥离 VLAN Tag,减少 CPU 负载和内存拷贝(节省上百周期,引用[2])。 - 支持单层/双层 VLAN(引用[3]的 IEEE 802.1ad 支持)。 2. **DPDK 实现机制** - PMD 驱动通过检查 mbuf 的 `ol_flags` 触发硬件卸载(引用[1])。 - `rte_eth_tx_burst()` 发送时,硬件根据配置自动插入 VLAN Tag(引用[4])。 #### 五、常见问题排查 1. **卸载未生效** - 检查 `tx_vlan` 和 `rx_vlan` 配置是否正确 - 确认硬件支持 VLAN 卸载(引用[3]) - 验证 `tx-offloads/rx-offloads` 启动参数 2. **性能提升验证** 对比关闭 VLAN 卸载时的 CPU 利用率: ```bash # 关闭卸载 --tx-offloads=0x0 --rx-offloads=0x0 ``` > **引用说明**: > VLAN 设置命令参考 testpmd 实现[^1],硬件卸载原理基于网卡能力[^3],DPDK 数据面处理流程见驱动模型[^4]。 --- ### 相关问题 1. **如何验证 DPDK 中其他硬件卸载功能(如 Checksum Offload)?** > 可通过 `testpmd` 的 `tx_checksum set` 命令配置,并用抓包工具验证 IP/TCP 校验和自动生成。 2. **DPDK 支持哪些网卡的 QinQ(双层 VLAN)卸载?** > 参考硬件支持表(如 Intel X710/XL710 支持 Double VLAN[^3]),通过 `tx_vlan set port_id vlan_id_outer,vlan_id_inner` 配置。 3. **VLAN 卸载失败时如何定位是硬件还是软件问题?** > 步骤: > a) 检查 `ethtool -k <iface>` 确认内核驱动是否启用 VLAN 卸载 > b) 通过 `dpdk-procinfo` 查看 PMD 能力标志 > c) 对比硬件寄存器配置与 DPDK 日志中的错误码。 4. **如何通过代码实现 VLAN 卸载(非 testpmd)?** > 在 DPDK 应用中: > - 发送端:设置 `mbuf->ol_flags |= PKT_TX_VLAN` 并指定 `vlan_tci` > - 接收端:检查 `mbuf->ol_flags & PKT_RX_VLAN_STRIPPED` > 参考 PMD 驱动中的 `tx_desc` 配置[^1][^4]。 [^1]: DPDK PMD 通过检查 mbuf 设置触发硬件 VLAN 插入 [^2]: 硬件卸载避免 CPU 额外负载和内存拷贝 [^3]: 网卡硬件卸载支持列表(如 i350/X550/XL710) [^4]: DPDK 应用通过 rte_eth_tx_burst/rx_burst 收发数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值