For some drivers which can not support the configured RSS hash functions, the thread reports 'invalid rss_hf' when doing device configure.
For example, i40e driver can not support 'RTE_ETH_RSS_IPV4', 'RTE_ETH_RSS_IPV6' and 'RTE_ETH_RSS_NONFRAG_IPV6_OTHER', thus it can not run successfully in test-pipeline with XL710 NIC and reports the issue: ------------------------------------------------------------- Ethdev port_id=0 invalid rss_hf: 0xa38c, valid value: 0x7ef8 PANIC in app_init_ports(): Cannot init NIC port 0 (-22) ------------------------------------------------------------- To fix this, referring to l3fwd operation, adjust the 'rss_hf' based on device capability and just report a warning. Signed-off-by: Feifei Wang <feifei.wa...@arm.com> Reviewed-by: Ruifeng Wang <ruifeng.w...@arm.com> Reviewed-by: Trevor Tao <trevor....@arm.com> Acked-by: Huisong Li <lihuis...@huawei.com> --- app/test-pipeline/init.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/app/test-pipeline/init.c b/app/test-pipeline/init.c index d146c44be0..84a1734519 100644 --- a/app/test-pipeline/init.c +++ b/app/test-pipeline/init.c @@ -188,21 +188,41 @@ static void app_init_ports(void) { uint32_t i; + struct rte_eth_dev_info dev_info; + /* Init NIC ports, then start the ports */ for (i = 0; i < app.n_ports; i++) { uint16_t port; int ret; + struct rte_eth_conf local_port_conf = port_conf; port = app.ports[i]; RTE_LOG(INFO, USER1, "Initializing NIC port %u ...\n", port); + ret = rte_eth_dev_info_get(port, &dev_info); + if (ret != 0) + rte_panic("Error during getting device (port %u) info: %s\n", + port, rte_strerror(-ret)); + /* Init port */ + local_port_conf.rx_adv_conf.rss_conf.rss_hf &= + dev_info.flow_type_rss_offloads; + if (local_port_conf.rx_adv_conf.rss_conf.rss_hf != + port_conf.rx_adv_conf.rss_conf.rss_hf) { + printf("Warning:" + "Port %u modified RSS hash function based on hardware support," + "requested:%#"PRIx64" configured:%#"PRIx64"\n", + port, + port_conf.rx_adv_conf.rss_conf.rss_hf, + local_port_conf.rx_adv_conf.rss_conf.rss_hf); + } + ret = rte_eth_dev_configure( port, 1, 1, - &port_conf); + &local_port_conf); if (ret < 0) rte_panic("Cannot init NIC port %u (%d)\n", port, ret); -- 2.25.1