我正在使用IXGBE Nic,使用dpdk 19.11多rx队列和rss"ETH_ RSS_TCP | ETH_;。IXGBE最多支持64个队列,我使用了4个队列。但是所有的包都被排列到同一个队列(队列0(,rss函数似乎不能很好地工作。以下是我的rss部分的伪代码。rss函数没有生效是因为我的配置不正确吗?
static int rss_setup(const int port_id, const uint16_t nb_queues)
{
int i;
int ret;
struct rte_eth_dev_info dev_info;
struct rte_eth_rss_reta_entry64 *reta_conf = NULL;
rte_eth_dev_info_get(port_id, &dev_info);
if (nb_queues == 0) {
return ERR_VAL;
}
reta_conf = calloc(dev_info.reta_size / RTE_RETA_GROUP_SIZE,
sizeof(struct rte_eth_rss_reta_entry64));
if (!reta_conf) {
return ERR_MEM;
}
for (i = 0; i < dev_info.reta_size; i++) {
struct rte_eth_rss_reta_entry64 *one_reta_conf =
&reta_conf[i / RTE_RETA_GROUP_SIZE];
one_reta_conf->reta[i % RTE_RETA_GROUP_SIZE] = i % nb_queues;
}
for (i = 0; i < dev_info.reta_size / RTE_RETA_GROUP_SIZE; i++) {
struct rte_eth_rss_reta_entry64 *one_reta_conf = &reta_conf[i];
one_reta_conf->mask = 0xFFFFFFFFFFFFFFFFULL;
}
ret = rte_eth_dev_rss_reta_update(port_id, reta_conf, dev_info.reta_size);
if (ret < 0) {
printf("cannot update rss reta at port %d: %sn",
port_id, rte_strerror(-ret));
}
free(reta_conf);
return ERR_OK;
}
main (){
struct rte_eth_conf conf = {0};
conf.link_speeds = ETH_LINK_SPEED_AUTONEG;
conf.txmode.mq_mode = ETH_MQ_TX_NONE;
conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
struct rte_eth_dev_info dev_info;
rte_eth_dev_info_get(port_id, &dev_info);
int rss_enable = 0;
uint64_t def_rss_hf = ETH_RSS_TCP | ETH_RSS_IP;
struct rte_eth_rss_conf rss_conf = {
NULL,
40,
def_rss_hf,
};
rss_conf.rss_hf &= dev_info->flow_type_rss_offloads;
if (rss_conf.rss_hf) {
rss_enable = 1;
conf->rx_adv_conf.rss_conf = rss_conf;
conf->rxmode.mq_mode = ETH_MQ_RX_RSS;
rss_setup(port_id, 4); // queues cnt is 4
}
}
-
看起来程序在调用
rss_setup()
之前没有调用rte_eth_dev_configure()
。这是不正确的,因为CCD_;必须在以太网API中的任何其它函数之前首先调用;(文档参考(。请重新安排程序以首先调用指定了rx_adv_conf.rss_conf
和ETH_MQ_RX_RSS
的rte_eth_dev_configure()
,然后继续进行其余的调用。 -
在
rss_setup()
中,程序调用rte_eth_dev_rss_reta_update()
。对于有问题的PMD,只能在启动状态(代码参考(下调用此API。因此,请重新安排程序,以便在rss_setup()
之前调用rte_eth_dev_start()
。 -
请确保TCP源端口号(和/或IP源地址(在发送方是随机的。如果IP/TCP源和目标字段没有变化,那么数据包最终会出现在同一个Rx队列中也就不足为奇了。