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:
parent
0ba52a330f
commit
8599ed31f2
@ -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,11 +2727,34 @@ cmd_config_burst_parsed(void *parsed_result,
|
||||
}
|
||||
|
||||
if (!strcmp(res->name, "burst")) {
|
||||
if (res->value < 1 || res->value > 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;
|
||||
}
|
||||
nb_pkt_per_burst = res->value;
|
||||
} else
|
||||
nb_pkt_per_burst = res->value;
|
||||
} else {
|
||||
printf("Unknown parameter\n");
|
||||
return;
|
||||
|
@ -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,
|
||||
"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 >= 1 and <= %d]",
|
||||
MAX_PKT_BURST);
|
||||
"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);
|
||||
|
@ -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. */
|
||||
|
||||
|
@ -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``
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user