> -----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

Reply via email to