> -----Original Message----- > From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Wei Dai > Sent: Monday, January 8, 2018 1:03 PM > To: Lu, Wenzhuo <wenzhuo...@intel.com>; Wu, Jingjing <jingjing...@intel.com>; > Peng, Yuan <yuan.p...@intel.com> > Cc: dev@dpdk.org; sta...@dpdk.org; Dai, Wei <wei....@intel.com> > Subject: [dpdk-dev] [PATCH 1/2] app/testpmd: fix invalid rxq number setting > > 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: sta...@dpdk.org > > Signed-off-by: Wei Dai <wei....@intel.com> > --- > app/test-pmd/cmdline.c | 1 + > app/test-pmd/testpmd.c | 10 ++++++++-- > app/test-pmd/testpmd.h | 2 ++ > 3 files changed, 11 insertions(+), 2 deletions(-) > > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c > index f71d963..3f3986c 100644 > --- a/app/test-pmd/cmdline.c > +++ b/app/test-pmd/cmdline.c > @@ -1501,6 +1501,7 @@ cmd_config_rx_tx_parsed(void *parsed_result, > printf("Warning: Either rx or tx queues should be non > zero\n"); > return; > } > + 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 47e145c..5939c88 100644 > --- a/app/test-pmd/testpmd.c > +++ b/app/test-pmd/testpmd.c > @@ -188,6 +188,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. > */ > @@ -708,10 +710,14 @@ init_fwd_streams(void) > port = &ports[pid]; > if (nb_rxq > port->dev_info.max_rx_queues) {
Why not to add that check in the function handler for " port config ... rxq ..." command itself? In that case you wouldn't need nb_rxq_bak at all. Konstantin > 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), restore to backup " > + "rxq number(%d)\n", nb_rxq, > + port->dev_info.max_rx_queues, > + nb_rxq_bak); > + nb_rxq = nb_rxq_bak; > return -1; > } > + nb_rxq_bak = nb_rxq; > if (nb_txq > port->dev_info.max_tx_queues) { > printf("Fail: nb_txq(%d) is greater than " > "max_tx_queues(%d)\n", nb_txq, > diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h > index 4d7f27c..84246f7 100644 > --- a/app/test-pmd/testpmd.h > +++ b/app/test-pmd/testpmd.h > @@ -391,6 +391,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; > > -- > 2.7.5