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:
parent
3f7311ba0b
commit
36db4f6c70
@ -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")) {
|
||||
|
@ -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 "
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user