From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id 85D091B1B0; Wed, 10 Jan 2018 09:57:09 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Jan 2018 00:57:09 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,339,1511856000"; d="scan'208";a="8652373" Received: from dpdk6.bj.intel.com ([172.16.182.87]) by fmsmga008.fm.intel.com with ESMTP; 10 Jan 2018 00:57:07 -0800 From: Wei Dai To: konstantin.ananyev@intel.com, qiming.yang@intel.com, yuan.peng@intel.com, wenzhuo.lu@intel.com, jingjing.wu@intel.com Cc: dev@dpdk.org, stable@dpdk.org, Wei Dai Date: Wed, 10 Jan 2018 16:40:56 +0800 Message-Id: <1515573656-41847-3-git-send-email-wei.dai@intel.com> X-Mailer: git-send-email 2.7.5 In-Reply-To: <1515573656-41847-1-git-send-email-wei.dai@intel.com> References: <1515557660-36763-1-git-send-email-wei.dai@intel.com> <1515573656-41847-1-git-send-email-wei.dai@intel.com> Subject: [dpdk-dev] [PATCH v3 2/2] app/testpmd: fix invalid txq number setting 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, 10 Jan 2018 08:57:10 -0000 If an invalid TX queue is configured from testpmd command like "port config all txq number", the global variable txq is updated by this invalid value. It may cause testpmd crash. This patch restores its last correct value when an invalid txq number configured is detected. Fixes: ce8d561418d4 ("app/testpmd: add port configuration settings") Cc: stable@dpdk.org Signed-off-by: Wei Dai --- app/test-pmd/cmdline.c | 2 ++ app/test-pmd/parameters.c | 6 +++--- app/test-pmd/testpmd.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ app/test-pmd/testpmd.h | 2 ++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index f0623b1..6619cb8 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -1527,6 +1527,8 @@ cmd_config_rx_tx_parsed(void *parsed_result, printf("Warning: Either rx or tx queues should be non zero\n"); return; } + if (check_nb_txq(res->value) != 0) + return; nb_txq = res->value; } else if (!strcmp(res->name, "rxd")) { diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index eac1826..6b5925d 100644 --- a/app/test-pmd/parameters.c +++ b/app/test-pmd/parameters.c @@ -932,12 +932,12 @@ launch_args_parse(int argc, char** argv) } if (!strcmp(lgopts[opt_idx].name, "txq")) { n = atoi(optarg); - if (n >= 0 && n <= (int) MAX_QUEUE_ID) + if (n >= 0 && check_nb_txq((queueid_t)n) == 0) nb_txq = (queueid_t) n; else rte_exit(EXIT_FAILURE, "txq %d invalid - must be" - " >= 0 && <= %d\n", n, - (int) MAX_QUEUE_ID); + " >= 0 && <= %u\n", n, + get_allowed_nb_txq(&pid)); } if (!nb_rxq && !nb_txq) { rte_exit(EXIT_FAILURE, "Either rx or tx queues should " diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 1203b17..fb8bb48 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -587,6 +587,53 @@ check_nb_rxq(queueid_t rxq) return 0; } +/* + * Get the allowed maximum number of TX queues. + * *pid return the port id which has mimumal value of + * max_tx_queues in all ports. + */ + +queueid_t +get_allowed_nb_txq(portid_t *pid) +{ + queueid_t allowed_max_txq = MAX_QUEUE_ID; + portid_t pi; + struct rte_eth_dev_info dev_info; + + RTE_ETH_FOREACH_DEV(pi) { + rte_eth_dev_info_get(pi, &dev_info); + if (dev_info.max_tx_queues < allowed_max_txq) { + allowed_max_txq = dev_info.max_tx_queues; + *pid = pi; + } + } + return allowed_max_txq; +} + +/* + * Check input txq is valid or not. + * If input txq is not greater than any of maximum number + * of TX queues of all ports, it is valid. + * if valid, return 0, else return -1 + */ +int +check_nb_txq(queueid_t txq) +{ + queueid_t allowed_max_txq; + portid_t pid; + + allowed_max_txq = get_allowed_nb_txq(&pid); + if (txq > allowed_max_txq) { + printf("Fail: input txq (%u) can't be greater " + "than max_tx_queues (%u) of port %u\n", + txq, + allowed_max_txq, + pid); + return -1; + } + return 0; +} + static void init_config(void) { diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 1e38f43..b848364 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -702,6 +702,8 @@ int new_socket_id(unsigned int socket_id); queueid_t get_allowed_nb_rxq(portid_t *pid); int check_nb_rxq(queueid_t rxq); +queueid_t get_allowed_nb_txq(portid_t *pid); +int check_nb_txq(queueid_t txq); /* * Work-around of a compilation error with ICC on invocations of the -- 2.7.5