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

Message ID 1515416551-28636-2-git-send-email-wei.dai@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers

Checks

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

Commit Message

Wei Dai Jan. 8, 2018, 1:02 p.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 |  1 +
 app/test-pmd/testpmd.c | 10 ++++++++--
 app/test-pmd/testpmd.h |  2 ++
 3 files changed, 11 insertions(+), 2 deletions(-)
  

Comments

Ananyev, Konstantin Jan. 8, 2018, 8:05 p.m. UTC | #1
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wei Dai
> Sent: Monday, January 8, 2018 1:03 PM
> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>; Peng, Yuan <yuan.peng@intel.com>
> Cc: dev@dpdk.org; stable@dpdk.org; Dai, Wei <wei.dai@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: stable@dpdk.org
> 
> Signed-off-by: Wei Dai <wei.dai@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
  
Wei Dai Jan. 10, 2018, 1:33 a.m. UTC | #2
> -----Original Message-----
> From: Ananyev, Konstantin
> Sent: Tuesday, January 9, 2018 4:06 AM
> To: Dai, Wei <wei.dai@intel.com>; Lu, Wenzhuo <wenzhuo.lu@intel.com>;
> Wu, Jingjing <jingjing.wu@intel.com>; Peng, Yuan <yuan.peng@intel.com>
> Cc: dev@dpdk.org; stable@dpdk.org; Dai, Wei <wei.dai@intel.com>
> Subject: RE: [dpdk-dev] [PATCH 1/2] app/testpmd: fix invalid rxq number
> setting
> 
> 
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wei Dai
> > Sent: Monday, January 8, 2018 1:03 PM
> > To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
> > <jingjing.wu@intel.com>; Peng, Yuan <yuan.peng@intel.com>
> > Cc: dev@dpdk.org; stable@dpdk.org; Dai, Wei <wei.dai@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: stable@dpdk.org
> >
> > Signed-off-by: Wei Dai <wei.dai@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

Thanks for your feedback, Konstantin.
I see your point. If that check is added in the function handler of command line,
same loop code will be repeated.

There are 2 ways to change nb_rxq:
1. with --rxq in the command line to start testpmd app to overwrite the default value 1
2. with "port config all rxq number" in the testpmd run time command line

How can your method correct an invalid input with --rxq in the command to start testpm app ?

By the way,  my v1 patch has a bug in case of more than 1 port with different maximum number of Rx queues.
For example,  the max_rx_queues of port 0 is 8 and that of port 1 is 4.
The previous valid rxq=4, if "port config all rxq 5" is run,
The nb_rxq_bak is updated to 5,  nb_rxq can't be restored to last correct value 4 for port 1.

I will fix bug in my v2 patch.

 
> 
> >  			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
  
Ananyev, Konstantin Jan. 10, 2018, 1:54 a.m. UTC | #3
> -----Original Message-----
> From: Dai, Wei
> Sent: Wednesday, January 10, 2018 1:34 AM
> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>;
> Peng, Yuan <yuan.peng@intel.com>
> Cc: dev@dpdk.org; stable@dpdk.org
> Subject: RE: [dpdk-dev] [PATCH 1/2] app/testpmd: fix invalid rxq number setting
> 
> > -----Original Message-----
> > From: Ananyev, Konstantin
> > Sent: Tuesday, January 9, 2018 4:06 AM
> > To: Dai, Wei <wei.dai@intel.com>; Lu, Wenzhuo <wenzhuo.lu@intel.com>;
> > Wu, Jingjing <jingjing.wu@intel.com>; Peng, Yuan <yuan.peng@intel.com>
> > Cc: dev@dpdk.org; stable@dpdk.org; Dai, Wei <wei.dai@intel.com>
> > Subject: RE: [dpdk-dev] [PATCH 1/2] app/testpmd: fix invalid rxq number
> > setting
> >
> >
> >
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wei Dai
> > > Sent: Monday, January 8, 2018 1:03 PM
> > > To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
> > > <jingjing.wu@intel.com>; Peng, Yuan <yuan.peng@intel.com>
> > > Cc: dev@dpdk.org; stable@dpdk.org; Dai, Wei <wei.dai@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: stable@dpdk.org
> > >
> > > Signed-off-by: Wei Dai <wei.dai@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
> 
> Thanks for your feedback, Konstantin.
> I see your point. If that check is added in the function handler of command line,
> same loop code will be repeated.
> 
> There are 2 ways to change nb_rxq:
> 1. with --rxq in the command line to start testpmd app to overwrite the default value 1
> 2. with "port config all rxq number" in the testpmd run time command line
> 
> How can your method correct an invalid input with --rxq in the command to start testpm app ?

Have a separate function: test_queue_num(port, qnum) and call it from both places?
Konstantin 

> 
> By the way,  my v1 patch has a bug in case of more than 1 port with different maximum number of Rx queues.
> For example,  the max_rx_queues of port 0 is 8 and that of port 1 is 4.
> The previous valid rxq=4, if "port config all rxq 5" is run,
> The nb_rxq_bak is updated to 5,  nb_rxq can't be restored to last correct value 4 for port 1.
> 
> I will fix bug in my v2 patch.
> 
> 
> >
> > >  			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
  
Wei Dai Jan. 10, 2018, 6 a.m. UTC | #4
> -----Original Message-----
> From: Ananyev, Konstantin
> Sent: Wednesday, January 10, 2018 9:55 AM
> To: Dai, Wei <wei.dai@intel.com>; Lu, Wenzhuo <wenzhuo.lu@intel.com>;
> Wu, Jingjing <jingjing.wu@intel.com>; Peng, Yuan <yuan.peng@intel.com>
> Cc: dev@dpdk.org; stable@dpdk.org
> Subject: RE: [dpdk-dev] [PATCH 1/2] app/testpmd: fix invalid rxq number
> setting
> 
> 
> 
> > -----Original Message-----
> > From: Dai, Wei
> > Sent: Wednesday, January 10, 2018 1:34 AM
> > To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Lu, Wenzhuo
> > <wenzhuo.lu@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>; Peng,
> > Yuan <yuan.peng@intel.com>
> > Cc: dev@dpdk.org; stable@dpdk.org
> > Subject: RE: [dpdk-dev] [PATCH 1/2] app/testpmd: fix invalid rxq
> > number setting
> >
> > > -----Original Message-----
> > > From: Ananyev, Konstantin
> > > Sent: Tuesday, January 9, 2018 4:06 AM
> > > To: Dai, Wei <wei.dai@intel.com>; Lu, Wenzhuo
> > > <wenzhuo.lu@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>; Peng,
> > > Yuan <yuan.peng@intel.com>
> > > Cc: dev@dpdk.org; stable@dpdk.org; Dai, Wei <wei.dai@intel.com>
> > > Subject: RE: [dpdk-dev] [PATCH 1/2] app/testpmd: fix invalid rxq
> > > number setting
> > >
> > >
> > >
> > > > -----Original Message-----
> > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wei Dai
> > > > Sent: Monday, January 8, 2018 1:03 PM
> > > > To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
> > > > <jingjing.wu@intel.com>; Peng, Yuan <yuan.peng@intel.com>
> > > > Cc: dev@dpdk.org; stable@dpdk.org; Dai, Wei <wei.dai@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: stable@dpdk.org
> > > >
> > > > Signed-off-by: Wei Dai <wei.dai@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
> >
> > Thanks for your feedback, Konstantin.
> > I see your point. If that check is added in the function handler of
> > command line, same loop code will be repeated.
> >
> > There are 2 ways to change nb_rxq:
> > 1. with --rxq in the command line to start testpmd app to overwrite
> > the default value 1 2. with "port config all rxq number" in the
> > testpmd run time command line
> >
> > How can your method correct an invalid input with --rxq in the command
> to start testpm app ?
> 
> Have a separate function: test_queue_num(port, qnum) and call it from both
> places?
> Konstantin
> 

This nb_rxq is a common setting for all ports.
I can follow your guide in my v3 patch. 
Thanks

> >
> > By the way,  my v1 patch has a bug in case of more than 1 port with
> different maximum number of Rx queues.
> > For example,  the max_rx_queues of port 0 is 8 and that of port 1 is 4.
> > The previous valid rxq=4, if "port config all rxq 5" is run, The
> > nb_rxq_bak is updated to 5,  nb_rxq can't be restored to last correct value
> 4 for port 1.
> >
> > I will fix bug in my v2 patch.
> >
> >
> > >
> > > >  			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
  

Patch

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) {
 			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;