dpdk-18.11网卡多队列RSS设置
背景
最近在做将基于dpdk-16.11.1开发的程序,转移到基于dpdk-18.11版本下开发。遇到了网卡RSS配置的问题,在这里纪录一下。
问题
dpdk-16.11.1
在dpdk-16.11.1上的程序如下:
static uint8_t rss_intel_key[40] = { 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A};static const struct rte_eth_conf port_conf = {.rxmode = {.mq_mode = ETH_MQ_RX_RSS,.split_hdr_size = 0,.header_split = 0, /**< Header Split disabled */.hw_ip_checksum = 0, /**< IP checksum offload disabled */.hw_vlan_filter = 0, /**< VLAN filtering disabled */.jumbo_frame = 0, /**< Jumbo Frame Support disabled */.hw_strip_crc = 0, /**< CRC stripped by hardware */},.rx_adv_conf = {.rss_conf = {.rss_key = rss_intel_key,.rss_hf = ETH_RSS_PROTO_MASK,},},.txmode = {.mq_mode = ETH_MQ_TX_NONE,}, };
rte_eth_dev_configure函数声明
int rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_queue,uint16_t nb_tx_queue, const struct rte_eth_conf *eth_conf);
无论是千兆网卡还是万兆网卡,在调用 rte_eth_dev_configure(port_id, nb_rx_queue, nb_tx_queue, &port_conf) 函数时都可以正常启动。
dpdk-18.11
dpdk-18.11中对 struct rte_eth_conf 结构体进行了修改,使用offloads代替了之前的几个变量标志位,不过这都影响不大。
static uint8_t rss_intel_key[40] = { 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A};static const struct rte_eth_conf port_conf = {.rxmode = {.mq_mode = ETH_MQ_RX_RSS,.max_rx_pkt_len = 0,.split_hdr_size = 0,.offloads = 0,},.rx_adv_conf = {.rss_conf = {.rss_key = rss_intel_key,.rss_key_len = 40,.rss_hf = ETH_RSS_PROTO_MASK,},},.txmode = {.mq_mode = ETH_MQ_TX_NONE,}, };
在调用 rte_eth_dev_configure(port_id, nb_rx_queue, nb_tx_queue, &port_conf) 函数是和16.11.1上是一致的。
在编译完成后,进行运行时发现,报错无法运行。报错如下:
Ethdev port_id=0 invalid rss_hf: 0x3ffffc, valid value: 0x38d34
port_id 0是一个igb驱动的网卡,型号为I350。
报错的意思是在调用 rte_eth_dev_configure 函数时,传入的最后一个函数参数(也就是网卡配置)中的 rx_adv_conf.rss_conf.rss_hf 参数值有问题,这个值是无效的。有效值是 0x38d34。
找到dpdk源码中打印错误信息的位置,前后代码如下:
int rte_eth_dev_rss_hash_update(uint16_t port_id,struct rte_eth_rss_conf *rss_conf) {struct rte_eth_dev *dev;struct rte_eth_dev_info dev_info = { .flow_type_rss_offloads = 0, };RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);dev = &rte_eth_devices[port_id];rte_eth_dev_info_get(port_id, &dev_info);if ((dev_info.flow_type_rss_offloads | rss_conf->rss_hf) !=dev_info.flow_type_rss_offloads) {RTE_ETHDEV_LOG(ERR,"Ethdev port_id=%u invalid rss_hf: 0x%"PRIx64", valid value: 0x%"PRIx64"\n",port_id, rss_conf->rss_hf,dev_info.flow_type_rss_offloads);return -EINVAL;}RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_update, -ENOTSUP);return eth_err(port_id, (*dev->dev_ops->rss_hash_update)(dev,rss_conf)); }
dev_info.flow_type_rss_offloads 就是网卡支持的flow类型, rss_conf->rss_hf 就是我们调用 rte_eth_dev_configure 函数的最后一个参考中的 rx_adv_conf.rss_conf.rss_hf 的值,
这里的if判断意思是配置的flow类型必须是网卡支持的flow类型,如果配置了网卡不支持的类型,就会报错。
经过计算器算出 0x38d34的二进制是111000110100110100,再配合在 rte_ethdev.h 中 ETH_RSS_开头的宏定义,得出111000110100110100就是下面所有宏定义的 或 值:
ETH_RSS_IPV4 | \ ETH_RSS_NONFRAG_IPV4_TCP| \ ETH_RSS_NONFRAG_IPV4_UDP| \ ETH_RSS_IPV6 | \ ETH_RSS_NONFRAG_IPV6_TCP | \ ETH_RSS_NONFRAG_IPV6_UDP | \ ETH_RSS_IPV6_EX | \ ETH_RSS_IPV6_TCP_EX | \ ETH_RSS_IPV6_UDP_EX
而我们配置中的参数 ETH_RSS_PROTO_MASK 显然比上面的类型要多,也就是 ETH_RSS_PROTO_MASK 定义的一些类型,网卡不支持,故而报错。
我们再看16.11.1中的源码
int rte_eth_dev_rss_hash_update(uint8_t port_id, struct rte_eth_rss_conf *rss_conf) {struct rte_eth_dev *dev;uint16_t rss_hash_protos;RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);rss_hash_protos = rss_conf->rss_hf;if ((rss_hash_protos != 0) &&((rss_hash_protos & ETH_RSS_PROTO_MASK) == 0)) {RTE_PMD_DEBUG_TRACE("Invalid rss_hash_protos=0x%x\n",rss_hash_protos);return -EINVAL;}dev = &rte_eth_devices[port_id];RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_update, -ENOTSUP);return (*dev->dev_ops->rss_hash_update)(dev, rss_conf); }
显然判断逻辑不同的。这里的判断意思是,只要有配置,并且配置中的flow类型至少有1项是在 ETH_RSS_PROTO_MASK 中的就可以,除非你配置的类型都不在 ETH_RSS_PROTO_MASK 中才会报错,这里就可以看出,即使你配置了网卡不支持的特性,也不会报错。
至此问题已解决。
总结
在dpdk-18.11中,配置网卡rss,必须网卡支持这种特性才行,否则会报错。
下面是整理的 igb , ixgbe , i40e 驱动网卡所支持的flow类型。
igb支持的特性
测试使用I350及I211网卡,有效值为0x38d34,二进制为111000110100110100,对应宏定义为
#define ETH_RSS_E1000_IGB (\ETH_RSS_IPV4 | \ETH_RSS_NONFRAG_IPV4_TCP| \ETH_RSS_NONFRAG_IPV4_UDP| \ETH_RSS_IPV6 | \ETH_RSS_NONFRAG_IPV6_TCP | \ETH_RSS_NONFRAG_IPV6_UDP | \ETH_RSS_IPV6_EX | \ETH_RSS_IPV6_TCP_EX | \ETH_RSS_IPV6_UDP_EX)
ixgbe支持的特性
测试使用82599ES网卡,有效值和igb相同
#define ETH_RSS_IXGBE ETH_RSS_E1000_IGB
i40e支持的特性
测试使用X710网卡,有效值为0x7ef8,二进制为111111011111000,对应宏定义为
#define ETH_RSS_I40E (\ETH_RSS_FRAG_IPV4 | \ETH_RSS_NONFRAG_IPV4_TCP | \ETH_RSS_NONFRAG_IPV4_UDP | \ETH_RSS_NONFRAG_IPV4_SCTP | \ETH_RSS_NONFRAG_IPV4_OTHER | \ETH_RSS_FRAG_IPV6 | \ETH_RSS_NONFRAG_IPV6_TCP | \ETH_RSS_NONFRAG_IPV6_UDP | \ETH_RSS_NONFRAG_IPV6_SCTP | \ETH_RSS_NONFRAG_IPV6_OTHER | \ETH_RSS_L2_PAYLOAD)
转载于:https://www.cnblogs.com/yanhai307/p/10608323.html
dpdk-18.11网卡多队列RSS设置相关推荐
- DPDK 应用层对网卡进行配置(二十四)
dpdk用户态驱动初始化完成后,应用层就可以来对网卡进行设置操作.对于每一个网卡,应用层都需要调用相应接口进行配置.可以对网卡进行哪些设置操作呢? 例如应用层将对网卡进行配置下发,将配置信息下发给网卡 ...
- Linux网卡多队列学习笔记
Linux网卡多队列的原理 Linux kernel在2.6.21之前不支持网卡多队列的特性,也就是一个网卡只能申请一个中断号. 在2.6.21开始支持网卡多队列,当网卡驱动加载的时候,通过获取网卡型 ...
- DPDK 20.11 Dynamic mbuf
目录 背景 解决方法 申请外部结构 增大mbuf的空间 多种布局 Dynamic mbuf 原理 使用/API 更大的额外空间的需求怎么办? 参考 背景 需要metadata的场景 通用的metada ...
- 网卡多队列:RPS、RFS、RSS、Flow Director(DPDK支持)
Table of Contents 多队列简介 RPS介绍(Receive Packet Steering) RFS介绍(Receive flow steering) RSS介绍(receive si ...
- 网卡多队列、RSS、RPS、RFS
1.网卡多队列 网卡升级换代之后,变成了多队列网卡,这个队列指的是供网卡DMA读取的ring buffer,即此时网卡会有多个ring buffer. 当有多个数据包到达网卡时,网卡的微处理器,根据数 ...
- linux 网卡多队列设置,网卡多队列
REF 简单命令 推荐使用较新的 Linux 发行版(如 CentOS 7.2)配置网卡多队列. 这里以 CentOS 7.2 为例介绍如何配置网卡多队列,假设是 2 个队列,网卡 interface ...
- linux网卡多队列技术
本篇文章主要是通过阅读了其他人的文章,后续进行了东拼西凑成自己可以理解的样子.但某些细节方面可以再进行深入研究和学习. 参考: https://www.cnblogs.com/lsgxeva/p/11 ...
- 网卡多队列,中断配置
1. 查看每一个cpu的负载以及中断指标:(参考:https://www.cnblogs.com/tcicy/p/10197136.html) 业务方在使用KVM虚拟机进行性能压测时,发现某一个核的s ...
- 十六周一次课(4月11日) 学习完成 18.11 LVS DR模式搭建 18.12 keepalived + LVS
2019独角兽企业重金招聘Python工程师标准>>> 18.11 LVS DR模式搭建 准备工作:三台机器 分发器,也叫调度器(简写为dir) 192.134 rs1 192.13 ...
最新文章
- “五心”知“五感”,平安打造有温度的智慧城市
- 如何测试大端存储和小端存储
- SAP Spartacus cxOutlet里的元数据存储,outlet名称和待渲染Component的映射关系
- k8s dashboard_k8s集群部署Dashboard
- 数据中异常值的鉴定和处理(1)
- 用python的pandas打开csv文件_使用CSV模块和Pandas在Python中读取和写入CSV文件
- SQL SERVER游标浅析
- “互联网+”从业务本质重构业务形态
- 邮件服务器篇:杀毒引擎选择论据
- Java编程:普里姆算法(已知起点求最小生成树)
- 项目总结报告(联东U谷)
- 华为设备无线环境中的Portal认证
- [JZOJ6080]【GDOI2019模拟2019.3.23】IOer【生成函数】【数学】
- 自适应遗传算法(AGA)《Adaptive Probabilities of Crossover》的剖析
- Caused by: org.elasticsearch.action.search.SearchPhaseExecutionException报错解决
- Kubeadm创建集群
- 《信息学奥赛一本通》宠物小精灵之收服
- RocketMQ的消费者消息重试和生产者消息重投
- ecshop小京东模板切换到smarty3.13之模板函数,用模板函数替换楼层
- python n维向量向任意方向旋转,求旋转矩阵
热门文章
- CTF-安恒19年二月月赛部分writeup
- go语言基础语法篇-变量
- docker版MySQL5.7容器管理
- Jupyter notebook的安装及使用
- 哪里有c语言教学视频,C语言教学视频(共32课更新完毕)(献给所有的爱好计算机的同学)(更新c+)...
- python打印汉字报错_python中文输出报错解决方案(实例教程)
- 锂电池储能系统建模发展现状及其数据驱动建模初步探讨
- 深度学习算法训练和部署流程介绍--让初学者一篇文章理解算法训练和部署流程
- 网页导出pdf不完整_试用:福昕PDF在线编辑器
- 【Linux】循序渐进学运维-服务篇-rysnc安装及使用