DPDK PMD设备无法停止:memif设备关闭流程报错求助
DPDK Memif设备关闭顺序问题排查与修复
错误原因解析
返回的错误码-95对应DPDK的RTE_ENOTSUP(操作不支持),核心问题出在状态不匹配:
- 当memif设备处于非运行状态(如已断开、未启动)时,调用
rte_eth_dev_stop()或rte_eth_promiscuous_disable()会因操作不符合当前设备状态返回不支持错误 memif_disconnect()的回调注销失败,是因为设备状态异常时,控制通道的回调已经被清理或不存在,导致断开操作无法执行
正确关闭流程与代码示例
memif作为DPDK虚拟以太网设备,关闭时需要先校验设备当前状态,避免无效操作,正确步骤如下:
- 先获取设备状态,仅当设备处于启动状态时执行stop操作
- 检查混杂模式是否开启,仅在开启状态下执行关闭操作
- 最后执行设备关闭(该API会强制清理所有残留资源)
示例代码:
struct rte_eth_dev_info dev_info; uint8_t promisc_enabled = 0; // 获取设备信息,校验状态合法性 if (rte_eth_dev_info_get(portId, &dev_info) == 0) { // 仅设备处于启动状态时执行stop if (dev_info.state == RTE_ETH_DEV_STARTED) { rte_eth_dev_stop(portId); } // 先确认混杂模式已开启,再执行关闭操作 if (rte_eth_promiscuous_get(portId, &promisc_enabled) == 0 && promisc_enabled) { rte_eth_promiscuous_disable(portId); } } // 最终执行设备关闭,该操作不受设备当前状态限制 rte_eth_dev_close(portId);
额外注意事项
- 客户端模式的memif无需手动调用
rte_memif_disconnect(),rte_eth_dev_stop()会自动处理连接断开逻辑 - 服务器模式的memif,关闭前需确保没有新的连接请求进入,避免残留未清理的连接资源
内容的提问来源于stack exchange,提问作者Mustafa
相关产品推荐
相关产品推荐

