app/testpmd: fix invalid Tx queue number setting

If an invalid number of TX queues is configured from testpmd run-time
command like "port config all txq number" or from --txq in the command
to start testpmd, the global variable nb_txq is updated by this invalid
value without this patch. It may cause testpmd crash. This patch refuses
invalid txq setting and keeps its last correct value.

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

Signed-off-by: Wei Dai <wei.dai@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Tested-by: Yuan Peng <yuan.peng@intel.com>
This commit is contained in:
Wei Dai 2018-01-12 19:31:22 +08:00 committed by Thomas Monjalon
parent 3f7311ba0b
commit 36db4f6c70
4 changed files with 53 additions and 3 deletions

View File

@ -1547,6 +1547,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_txq(res->value) != 0)
return;
nb_txq = res->value;
}
else if (!strcmp(res->name, "rxd")) {

View File

@ -935,12 +935,12 @@ launch_args_parse(int argc, char** argv)
}
if (!strcmp(lgopts[opt_idx].name, "txq")) {
n = atoi(optarg);
if (n >= 0 && n <= (int) MAX_QUEUE_ID)
if (n >= 0 && check_nb_txq((queueid_t)n) == 0)
nb_txq = (queueid_t) n;
else
rte_exit(EXIT_FAILURE, "txq %d invalid - must be"
" >= 0 && <= %d\n", n,
(int) MAX_QUEUE_ID);
" >= 0 && <= %u\n", n,
get_allowed_max_nb_txq(&pid));
}
if (!nb_rxq && !nb_txq) {
rte_exit(EXIT_FAILURE, "Either rx or tx queues should "

View File

@ -580,6 +580,52 @@ check_nb_rxq(queueid_t rxq)
return 0;
}
/*
* Get the allowed maximum number of TX queues.
* *pid return the port id which has minimal value of
* max_tx_queues in all ports.
*/
queueid_t
get_allowed_max_nb_txq(portid_t *pid)
{
queueid_t allowed_max_txq = 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_tx_queues < allowed_max_txq) {
allowed_max_txq = dev_info.max_tx_queues;
*pid = pi;
}
}
return allowed_max_txq;
}
/*
* Check input txq is valid or not.
* If input txq is not greater than any of maximum number
* of TX queues of all ports, it is valid.
* if valid, return 0, else return -1
*/
int
check_nb_txq(queueid_t txq)
{
queueid_t allowed_max_txq;
portid_t pid = 0;
allowed_max_txq = get_allowed_max_nb_txq(&pid);
if (txq > allowed_max_txq) {
printf("Fail: input txq (%u) can't be greater "
"than max_tx_queues (%u) of port %u\n",
txq,
allowed_max_txq,
pid);
return -1;
}
return 0;
}
static void
init_config(void)
{

View File

@ -686,6 +686,8 @@ int new_socket_id(unsigned int socket_id);
queueid_t get_allowed_max_nb_rxq(portid_t *pid);
int check_nb_rxq(queueid_t rxq);
queueid_t get_allowed_max_nb_txq(portid_t *pid);
int check_nb_txq(queueid_t txq);
/*
* Work-around of a compilation error with ICC on invocations of the