From 9089296206ceae3768cdf3a33441eee6735cdf1b Mon Sep 17 00:00:00 2001 From: Qi Zhang Date: Wed, 25 Apr 2018 21:38:16 +0800 Subject: [PATCH] app/testpmd: fix config due to RSS offload check After add RSS hash offload check, default rss_hf will fail on devices that not support all bits, the patch take rss_hf as a suggest value and only set bits that device supported base on rte_eth_dev_get_info, also rss_hf will only be updated when new rss offload is successfully updated on all ports by "port config all rss [!default]" command. Fixes: 8863a1fbfc66 ("ethdev: add supported hash function check") Fixes: d9aa619c60b6 ("app/testpmd: new parameter for port config all RSS command") Signed-off-by: Qi Zhang Reviewed-by: Ferruh Yigit Tested-by: Adrien Mazarguil --- app/test-pmd/cmdline.c | 15 +++++++++++---- app/test-pmd/testpmd.c | 5 ++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 7880cb2467..9615670708 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -2010,6 +2010,8 @@ cmd_config_rss_parsed(void *parsed_result, struct cmd_config_rss *res = parsed_result; struct rte_eth_rss_conf rss_conf = { .rss_key_len = 0, }; struct rte_eth_dev_info dev_info = { .flow_type_rss_offloads = 0, }; + int use_default = 0; + int all_updated = 1; int diag; uint16_t i; @@ -2035,8 +2037,10 @@ cmd_config_rss_parsed(void *parsed_result, rss_conf.rss_hf = ETH_RSS_GENEVE; else if (!strcmp(res->value, "nvgre")) rss_conf.rss_hf = ETH_RSS_NVGRE; - else if (!strcmp(res->value, "none") || !strcmp(res->value, "default")) + else if (!strcmp(res->value, "none")) rss_conf.rss_hf = 0; + else if (!strcmp(res->value, "default")) + use_default = 1; else if (isdigit(res->value[0]) && atoi(res->value) > 0 && atoi(res->value) < 64) rss_conf.rss_hf = 1ULL << atoi(res->value); @@ -2046,18 +2050,21 @@ cmd_config_rss_parsed(void *parsed_result, } rss_conf.rss_key = NULL; /* Update global configuration for RSS types. */ - rss_hf = rss_conf.rss_hf; RTE_ETH_FOREACH_DEV(i) { - if (!strcmp(res->value, "default")) { + if (use_default) { rte_eth_dev_info_get(i, &dev_info); rss_conf.rss_hf = dev_info.flow_type_rss_offloads; } diag = rte_eth_dev_rss_hash_update(i, &rss_conf); - if (diag < 0) + if (diag < 0) { + all_updated = 0; printf("Configuration of RSS hash at ethernet port %d " "failed with error (%d): %s.\n", i, -diag, strerror(-diag)); + } } + if (all_updated && !use_default) + rss_hf = rss_conf.rss_hf; } cmdline_parse_token_string_t cmd_config_rss_port = diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index e757d81223..db23f23e57 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -2290,13 +2290,16 @@ init_port_config(void) { portid_t pid; struct rte_port *port; + struct rte_eth_dev_info dev_info; RTE_ETH_FOREACH_DEV(pid) { port = &ports[pid]; port->dev_conf.fdir_conf = fdir_conf; if (nb_rxq > 1) { + rte_eth_dev_info_get(pid, &dev_info); port->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL; - port->dev_conf.rx_adv_conf.rss_conf.rss_hf = rss_hf; + port->dev_conf.rx_adv_conf.rss_conf.rss_hf = + rss_hf & dev_info.flow_type_rss_offloads; } else { port->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL; port->dev_conf.rx_adv_conf.rss_conf.rss_hf = 0; -- 2.20.1