[dpdk-dev,v2,1/2] app/testpmd: fix invalid rxq number setting

Message ID 1515557660-36763-2-git-send-email-wei.dai@intel.com (mailing list archive)
State Superseded, archived
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Wei Dai Jan. 10, 2018, 4:14 a.m. UTC
  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/testpmd.c | 13 +++++++++++--
 app/test-pmd/testpmd.h |  2 ++
 3 files changed, 15 insertions(+), 2 deletions(-)
  

Patch

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 5b2e2ef..a5a1d57 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;
 		}
+		/* bakcup last correct nb_rxq */
+		nb_rxq_bak = nb_rxq;
 		nb_rxq = res->value;
 	}
 	else if (!strcmp(res->name, "txq")) {
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 9414d0e..efafc24 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -189,6 +189,8 @@  uint8_t dcb_test = 0;
 queueid_t nb_rxq = 1; /**< Number of RX queues per port. */
 queueid_t nb_txq = 1; /**< Number of TX queues per port. */
 
+queueid_t nb_rxq_bak = 1; /**< Backup of last correct number of RX queues */
+
 /*
  * Configurable number of RX/TX ring descriptors.
  */
@@ -709,8 +711,12 @@  init_fwd_streams(void)
 		port = &ports[pid];
 		if (nb_rxq > port->dev_info.max_rx_queues) {
 			printf("Fail: nb_rxq(%d) is greater than "
-				"max_rx_queues(%d)\n", nb_rxq,
-				port->dev_info.max_rx_queues);
+				"max_rx_queues(%d), restored to backup "
+				"rxq number(%d)\n", nb_rxq,
+				port->dev_info.max_rx_queues,
+				nb_rxq_bak);
+			/* restored to last corrcect nb_rxq */
+			nb_rxq = nb_rxq_bak;
 			return -1;
 		}
 		if (nb_txq > port->dev_info.max_tx_queues) {
@@ -738,6 +744,9 @@  init_fwd_streams(void)
 		}
 	}
 
+	/* backup the correct nb_rxq */
+	nb_rxq_bak = nb_rxq;
+
 	q = RTE_MAX(nb_rxq, nb_txq);
 	if (q == 0) {
 		printf("Fail: Cannot allocate fwd streams as number of queues is 0\n");
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 2a266fd..6f7932d 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -392,6 +392,8 @@  extern uint64_t rss_hf;
 extern queueid_t nb_rxq;
 extern queueid_t nb_txq;
 
+extern queueid_t nb_rxq_bak;
+
 extern uint16_t nb_rxd;
 extern uint16_t nb_txd;