DPDK patches and discussions
 help / color / mirror / Atom feed
From: Wei Dai <wei.dai@intel.com>
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 <wei.dai@intel.com>
Subject: [dpdk-dev] [PATCH v3 1/2] app/testpmd: fix invalid rxq number setting
Date: Wed, 10 Jan 2018 16:40:55 +0800	[thread overview]
Message-ID: <1515573656-41847-2-git-send-email-wei.dai@intel.com> (raw)
In-Reply-To: <1515573656-41847-1-git-send-email-wei.dai@intel.com>

If an invalid RX queue is configured from testpmd command
like "port config all rxq number", the global variable rxq
is updated by this invalid value. It may cause testpmd crash.
This patch restores its last correct value when an invalid
rxq number configured is detected.

Fixes: ce8d561418d4 ("app/testpmd: add port configuration settings")
Cc: stable@dpdk.org

Signed-off-by: Wei Dai <wei.dai@intel.com>
---
 app/test-pmd/cmdline.c    |  2 ++
 app/test-pmd/parameters.c |  7 ++++---
 app/test-pmd/testpmd.c    | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 app/test-pmd/testpmd.h    |  3 +++
 4 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 5b2e2ef..f0623b1 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -1518,6 +1518,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_rxq(res->value) != 0)
+			return;
 		nb_rxq = res->value;
 	}
 	else if (!strcmp(res->name, "txq")) {
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 304b98d..eac1826 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -536,6 +536,7 @@ launch_args_parse(int argc, char** argv)
 	int n, opt;
 	char **argvopt;
 	int opt_idx;
+	portid_t pid;
 	enum { TX, RX };
 
 	static struct option lgopts[] = {
@@ -922,12 +923,12 @@ launch_args_parse(int argc, char** argv)
 				rss_hf = ETH_RSS_UDP;
 			if (!strcmp(lgopts[opt_idx].name, "rxq")) {
 				n = atoi(optarg);
-				if (n >= 0 && n <= (int) MAX_QUEUE_ID)
+				if (n >= 0 && check_nb_rxq((queueid_t)n) == 0)
 					nb_rxq = (queueid_t) n;
 				else
 					rte_exit(EXIT_FAILURE, "rxq %d invalid - must be"
-						  " >= 0 && <= %d\n", n,
-						  (int) MAX_QUEUE_ID);
+						  " >= 0 && <= %u\n", n,
+						  get_allowed_nb_rxq(&pid));
 			}
 			if (!strcmp(lgopts[opt_idx].name, "txq")) {
 				n = atoi(optarg);
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 9414d0e..1203b17 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -540,6 +540,53 @@ check_socket_id(const unsigned int socket_id)
 	return 0;
 }
 
+/*
+ * Get the allowed maximum number of RX queues.
+ * *pid return the port id which has mimumal value of
+ * max_rx_queues in all ports.
+ */
+
+queueid_t
+get_allowed_nb_rxq(portid_t *pid)
+{
+	queueid_t allowed_max_rxq = 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_rx_queues < allowed_max_rxq) {
+			allowed_max_rxq = dev_info.max_rx_queues;
+			*pid = pi;
+		}
+	}
+	return allowed_max_rxq;
+}
+
+/*
+ * Check input rxq is valid or not.
+ * If input rxq is not greater than any of maximum number
+ * of RX queues of all ports, it is valid.
+ * if valid, return 0, else return -1
+ */
+int
+check_nb_rxq(queueid_t rxq)
+{
+	queueid_t allowed_max_rxq;
+	portid_t pid;
+
+	allowed_max_rxq = get_allowed_nb_rxq(&pid);
+	if (rxq > allowed_max_rxq) {
+		printf("Fail: input rxq (%u) can't be greater "
+		       "than max_rx_queues (%u) of port %u\n",
+		       rxq,
+		       allowed_max_rxq,
+		       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 2a266fd..1e38f43 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -700,6 +700,9 @@ enum print_warning {
 int port_id_is_invalid(portid_t port_id, enum print_warning warning);
 int new_socket_id(unsigned int socket_id);
 
+queueid_t get_allowed_nb_rxq(portid_t *pid);
+int check_nb_rxq(queueid_t rxq);
+
 /*
  * Work-around of a compilation error with ICC on invocations of the
  * rte_be_to_cpu_16() function.
-- 
2.7.5

  reply	other threads:[~2018-01-10  8:57 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-08 13:02 [dpdk-dev] [PATCH 0/2] app/testpmd: fix invalid rxq and txq nubmer setting Wei Dai
2018-01-08 13:02 ` [dpdk-dev] [PATCH 1/2] app/testpmd: fix invalid rxq number setting Wei Dai
2018-01-08 20:05   ` Ananyev, Konstantin
2018-01-10  1:33     ` Dai, Wei
2018-01-10  1:54       ` Ananyev, Konstantin
2018-01-10  6:00         ` Dai, Wei
2018-01-08 13:02 ` [dpdk-dev] [PATCH 2/2] app/testpmd: fix invalid txq " Wei Dai
2018-01-10  4:14 ` [dpdk-dev] [PATCH v2 0/2] app/testpmd: fix invalid rxq and txq nubmer setting Wei Dai
2018-01-10  4:14   ` [dpdk-dev] [PATCH v2 1/2] app/testpmd: fix invalid rxq number setting Wei Dai
2018-01-10  4:14   ` [dpdk-dev] [PATCH v2 2/2] app/testpmd: fix invalid txq " Wei Dai
2018-01-10  6:37     ` Yang, Qiming
2018-01-10  8:50       ` Dai, Wei
2018-01-10  8:40   ` [dpdk-dev] [PATCH v3 0/2] app/testpmd: fix invalid rxq and txq nubmer setting Wei Dai
2018-01-10  8:40     ` Wei Dai [this message]
2018-01-10  8:40     ` [dpdk-dev] [PATCH v3 2/2] app/testpmd: fix invalid txq number setting Wei Dai
2018-01-10  9:58     ` [dpdk-dev] [PATCH v3 0/2] app/testpmd: fix invalid rxq and txq nubmer setting Ananyev, Konstantin
2018-01-11  1:21       ` Dai, Wei
2018-01-11  4:58     ` [dpdk-dev] [PATCH v4 0/2] app/testpmd: fix invalid rxq and txq nubmer settings Wei Dai
2018-01-11  4:58       ` [dpdk-dev] [PATCH v4 1/2] app/testpmd: fix invalid rxq number setting Wei Dai
2018-01-11  4:58       ` [dpdk-dev] [PATCH v4 2/2] app/testpmd: fix invalid txq " Wei Dai
2018-01-12  5:39       ` [dpdk-dev] [PATCH v4 0/2] app/testpmd: fix invalid rxq and txq nubmer settings Peng, Yuan
2018-01-12  6:05         ` Dai, Wei
2018-01-12  8:10       ` [dpdk-dev] [PATCH v5 " Wei Dai
2018-01-12  8:10         ` [dpdk-dev] [PATCH v5 1/2] app/testpmd: fix invalid rxq number setting Wei Dai
2018-01-12  9:09           ` Peng, Yuan
2018-01-12  8:10         ` [dpdk-dev] [PATCH v5 2/2] app/testpmd: fix invalid txq " Wei Dai
2018-01-12  9:12           ` Peng, Yuan
2018-01-12  9:09         ` [dpdk-dev] [PATCH v5 0/2] app/testpmd: fix invalid rxq and txq nubmer settings Peng, Yuan
2018-01-12 11:31         ` [dpdk-dev] [PATCH v6 " Wei Dai
2018-01-12 11:31           ` [dpdk-dev] [PATCH v6 1/2] app/testpmd: fix invalid rxq number setting Wei Dai
2018-01-12 11:31           ` [dpdk-dev] [PATCH v6 2/2] app/testpmd: fix invalid txq " Wei Dai
2018-01-17 14:06           ` [dpdk-dev] [PATCH v6 0/2] app/testpmd: fix invalid rxq and txq nubmer settings Thomas Monjalon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1515573656-41847-2-git-send-email-wei.dai@intel.com \
    --to=wei.dai@intel.com \
    --cc=dev@dpdk.org \
    --cc=jingjing.wu@intel.com \
    --cc=konstantin.ananyev@intel.com \
    --cc=qiming.yang@intel.com \
    --cc=stable@dpdk.org \
    --cc=wenzhuo.lu@intel.com \
    --cc=yuan.peng@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).