app/testpmd: make use of per-PMD Tx/Rx parameters
authorRemy Horton <remy.horton@intel.com>
Tue, 10 Apr 2018 09:43:19 +0000 (10:43 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 13 Apr 2018 22:43:30 +0000 (00:43 +0200)
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>
app/test-pmd/cmdline.c
app/test-pmd/parameters.c
app/test-pmd/testpmd.c
doc/guides/testpmd_app_ug/run_app.rst

index 92ef7e1..512e3b5 100644 (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,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;
index 1a05284..394fa6d 100644 (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,
+                                                       "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);
index 5986ff7..29e789e 100644 (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. */
 
index d0ced36..b3d98de 100644 (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``