From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 45B5A6CCE for ; Wed, 25 Apr 2018 15:38:04 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Apr 2018 06:38:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,326,1520924400"; d="scan'208";a="45952562" Received: from dpdk51.sh.intel.com ([10.67.110.184]) by orsmga003.jf.intel.com with ESMTP; 25 Apr 2018 06:38:02 -0700 From: Qi Zhang To: ferruh.yigit@intel.com, adrien.mazarguil@6wind.com Cc: thomas@monjalon.net, dev@dpdk.org, Qi Zhang Date: Wed, 25 Apr 2018 21:38:16 +0800 Message-Id: <20180425133816.198161-1-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180425014929.72014-1-qi.z.zhang@intel.com> References: <20180425014929.72014-1-qi.z.zhang@intel.com> Subject: [dpdk-dev] [PATCH v3] app/testpmd: fix testpmd failure due to RSS offload check X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Apr 2018 13:38:05 -0000 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: 586ac442be96 ("ethdev: add supported hash function check") Fixes: 8c1f4aff92a6 ("app/testpmd: new parameter for port config all RSS command") Signed-off-by: Qi Zhang --- 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 bdc2122a0..2d05fc91e 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -2007,6 +2007,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; @@ -2032,8 +2034,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); @@ -2043,18 +2047,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 e757d8122..db23f23e5 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.13.6