rss对称网卡linux,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函数声明
intrte_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源码中打印错误信息的位置,前后代码如下:
intrte_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中的源码
intrte_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)
rss对称网卡linux,dpdk-18.11网卡多队列RSS设置相关推荐
- linux下如何重启网卡,linux系统如何重启网卡
大家在实际工作中,经常会遇到Linux系统进行重启网卡的操作,那么具体如何进行重启呢?下面就由学习啦小编跟大家分享一下操作步骤吧,希望对大家有所帮助~ linux系统重启网卡的方法 一.service ...
- Linux拔掉网卡,linux系统怎么重启网卡?linux重启网卡的三种教程
在实际工作中,经常会遇到Linux系统进行重启网卡的操作.在这里整理一下,进行多种方法的网卡重启. 一.service network restart 1.首先用CRT工具连接到Linux命令行界面. ...
- linux安装8168网卡,Fedora 配置 RTL8168/8111 网卡 Linux下 RTL8168/8111 网卡配置
方法一. 官方下载Linux下驱动 r1000_r1.05.tgz 开始安装网卡驱动模块:进入存放rpm包的文件夹,这里我放在了/usr/src下面 #cd /usr/src #tar -zxvf r ...
- inteli211网卡linux驱动,Intel i211网卡在server2016中无驱动的解决方案
Intel为增加其服务器版本的主板销量,对一些非服务器的网卡,不提供驱动支持,所以在一些PC机.工控机.嵌入式系统上,你会为装了server2012R2或SERVER2016,却找不到网卡驱动而抓狂. ...
- F2FS nat entry涉及的数据结构(linux 5.18.11)
nat entry(简称ne)在代码中涉及多个数据结构,先上图. 图1 ne涉及的数据结构关系图 大的原则 1)红色部分是disk layout中的(持久化存储):蓝色部分是内存数据结构. 2)系统中 ...
- Linux Mint 18.2安装WPS之优化设置
1.WPS安装 首先去官网下载:WPS 安装: sudo dpkg -i wps-office_10.1.0.5672~a21_amd64.deb 或者,右键–使用GDebi安装 2.优化设置 1)因 ...
- DPDK 20.11 Dynamic mbuf
目录 背景 解决方法 申请外部结构 增大mbuf的空间 多种布局 Dynamic mbuf 原理 使用/API 更大的额外空间的需求怎么办? 参考 背景 需要metadata的场景 通用的metada ...
- linux pci 网卡驱动,linux网络设备驱动_pci网卡
<linux网络设备驱动_pci网卡>由会员分享,可在线阅读,更多相关<linux网络设备驱动_pci网卡(12页珍藏版)>请在技术文库上搜索. 1. LinuxLinux 网 ...
- Linux RHEL 7.9网卡配置bond0(主备模式)
Linux RHEL 7.9网卡配置bond0(主备模式) 一.实验环境准备及规划 系统:RHEL 7.9 网卡bond0(主备模式):ens33ens37bond0:192.168.100.40 v ...
- linux 3g拨号,嵌入式Linux系统实现3G网卡拨号
嵌入式Linux系统实现3G网卡拨号 本文介绍在嵌入式Linux中,实现3G联网的基本方法.包括驱动配置,和联网的过程.也对在PC上实现3G的过程进行了介绍. 硬件:3g usb模块(华为ce189的 ...
最新文章
- 分布式链路追踪zipkin
- kuka机器人股票代码_【内幕】溢价收购KUKA机器人 美的钱从哪来?
- vue 项目引用static目录资源_vuejs-templates静态资源目录src/assets、和static/区别
- MySQL运行一段时间后自动停止问题的排查
- 想在研发群里装?先学会这几个排查K8s问题的办法
- (Command Pattern)命令模式
- mysql 字符串截取_MySQL|SUBSTR() 函数用法
- vCenter如何逃离Windows的坑(转)
- VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件
- SQLServer性能优化之活用临时表
- 计算机考研839,2018年北京语言大学计算机软件与理论839计算机系统与设计之计算机操作系统考研基础五套测试题...
- WEB前端性能优化及应用服务器性能优化和存储性能优化
- CentOS配置postgresql+postsql
- 设置新版谷歌浏览器自动启用flash
- 如何制定人生目标和实现目标
- 一次做数据报表的踩坑经历,让我领略了数据同步增量和全量的区别
- Javascript_备忘录1
- 32位计算机支持word系统,Office 32位与64位版本有什么区别?
- css实现3D动画效果——正方体变六边形
- Stimulsoft Reports如何进行数据连接