app/testpmd: make use of per-PMD Tx/Rx parameters

The optimal values of several transmission & reception related
parameters, such as burst sizes, descriptor ring sizes, and number
of queues, varies between different network interface devices. This
patch allows testpmd to make use of per-PMD tuned parameter values.

Signed-off-by: Remy Horton <remy.horton@intel.com>
Acked-by: Shreyansh Jain <shreyansh.jain@nxp.com>
This commit is contained in:
Remy Horton 2018-04-10 10:43:19 +01:00 committed by Ferruh Yigit
parent 0ba52a330f
commit 8599ed31f2
4 changed files with 67 additions and 11 deletions

View File

@ -2718,6 +2718,8 @@ cmd_config_burst_parsed(void *parsed_result,
__attribute__((unused)) void *data)
{
struct cmd_config_burst *res = parsed_result;
struct rte_eth_dev_info dev_info;
uint16_t rec_nb_pkts;
if (!all_ports_stopped()) {
printf("Please stop all ports first\n");
@ -2725,10 +2727,33 @@ cmd_config_burst_parsed(void *parsed_result,
}
if (!strcmp(res->name, "burst")) {
if (res->value < 1 || res->value > MAX_PKT_BURST) {
printf("burst must be >= 1 && <= %d\n", MAX_PKT_BURST);
if (res->value == 0) {
/* If user gives a value of zero, query the PMD for
* its recommended Rx burst size. Testpmd uses a single
* size for all ports, so assume all ports are the same
* NIC model and use the values from Port 0.
*/
rte_eth_dev_info_get(0, &dev_info);
rec_nb_pkts = dev_info.default_rxportconf.burst_size;
if (rec_nb_pkts == 0) {
printf("PMD does not recommend a burst size.\n"
"User provided value must be between"
" 1 and %d\n", MAX_PKT_BURST);
return;
} else if (rec_nb_pkts > MAX_PKT_BURST) {
printf("PMD recommended burst size of %d"
" exceeds maximum value of %d\n",
rec_nb_pkts, MAX_PKT_BURST);
return;
}
printf("Using PMD-provided burst value of %d\n",
rec_nb_pkts);
nb_pkt_per_burst = rec_nb_pkts;
} else if (res->value > MAX_PKT_BURST) {
printf("burst must be >= 1 && <= %d\n", MAX_PKT_BURST);
return;
} else
nb_pkt_per_burst = res->value;
} else {
printf("Unknown parameter\n");

View File

@ -545,6 +545,8 @@ launch_args_parse(int argc, char** argv)
/* Default offloads for all ports. */
uint64_t rx_offloads = rx_mode.offloads;
uint64_t tx_offloads = tx_mode.offloads;
struct rte_eth_dev_info dev_info;
uint16_t rec_nb_pkts;
static struct option lgopts[] = {
{ "help", 0, 0, 0 },
@ -949,12 +951,38 @@ launch_args_parse(int argc, char** argv)
}
if (!strcmp(lgopts[opt_idx].name, "burst")) {
n = atoi(optarg);
if ((n >= 1) && (n <= MAX_PKT_BURST))
nb_pkt_per_burst = (uint16_t) n;
else
if (n == 0) {
/* A burst size of zero means that the
* PMD should be queried for
* recommended Rx burst size. Since
* testpmd uses a single size for all
* ports, port 0 is queried for the
* value, on the assumption that all
* ports are of the same NIC model.
*/
rte_eth_dev_info_get(0, &dev_info);
rec_nb_pkts = dev_info
.default_rxportconf.burst_size;
if (rec_nb_pkts == 0)
rte_exit(EXIT_FAILURE,
"burst must >= 1 and <= %d]",
"PMD does not recommend a burst size. "
"Provided value must be between "
"1 and %d\n", MAX_PKT_BURST);
else if (rec_nb_pkts > MAX_PKT_BURST)
rte_exit(EXIT_FAILURE,
"PMD recommended burst size of %d"
" exceeds maximum value of %d\n",
rec_nb_pkts, MAX_PKT_BURST);
printf("Using PMD-provided burst value of %d\n",
rec_nb_pkts);
nb_pkt_per_burst = rec_nb_pkts;
} else if (n > MAX_PKT_BURST)
rte_exit(EXIT_FAILURE,
"burst must be between1 and %d\n",
MAX_PKT_BURST);
else
nb_pkt_per_burst = (uint16_t) n;
}
if (!strcmp(lgopts[opt_idx].name, "mbcache")) {
n = atoi(optarg);

View File

@ -211,9 +211,10 @@ queueid_t nb_txq = 1; /**< Number of TX queues per port. */
/*
* Configurable number of RX/TX ring descriptors.
* Defaults are supplied by drivers via ethdev.
*/
#define RTE_TEST_RX_DESC_DEFAULT 1024
#define RTE_TEST_TX_DESC_DEFAULT 1024
#define RTE_TEST_RX_DESC_DEFAULT 0
#define RTE_TEST_TX_DESC_DEFAULT 0
uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT; /**< Number of RX descriptors. */
uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT; /**< Number of TX descriptors. */

View File

@ -372,7 +372,9 @@ The commandline options are:
* ``--burst=N``
Set the number of packets per burst to N, where 1 <= N <= 512.
The default value is 16.
The default value is 32.
If set to 0, driver default is used if defined. Else, if driver
default is not defined, default of 32 is used.
* ``--mbcache=N``