app/testpmd: add record-core-cycles runtime config
authorDharmik Thakkar <dharmik.thakkar@arm.com>
Tue, 14 Jul 2020 21:51:03 +0000 (16:51 -0500)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 18 Sep 2020 16:55:08 +0000 (18:55 +0200)
Convert CONFIG_RTE_TEST_PMD_RECORD_CORE_CYCLES to a
runtime configuration.

Signed-off-by: Dharmik Thakkar <dharmik.thakkar@arm.com>
Tested-by: Phil Yang <phil.yang@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
16 files changed:
app/test-pmd/5tswap.c
app/test-pmd/cmdline.c
app/test-pmd/config.c
app/test-pmd/csumonly.c
app/test-pmd/flowgen.c
app/test-pmd/icmpecho.c
app/test-pmd/iofwd.c
app/test-pmd/macfwd.c
app/test-pmd/macswap.c
app/test-pmd/parameters.c
app/test-pmd/rxonly.c
app/test-pmd/testpmd.c
app/test-pmd/testpmd.h
app/test-pmd/txonly.c
doc/guides/testpmd_app_ug/run_app.rst
doc/guides/testpmd_app_ug/testpmd_funcs.rst

index 972f6b9..04f035b 100644 (file)
@@ -105,15 +105,9 @@ pkt_burst_5tuple_swap(struct fwd_stream *fs)
                uint8_t *byte;
        } h;
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       uint64_t start_tsc;
-       uint64_t end_tsc;
-       uint64_t core_cycles;
-#endif
+       uint64_t start_tsc = 0;
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       start_tsc = rte_rdtsc();
-#endif
+       get_start_cycles(&start_tsc);
 
        /*
         * Receive a burst of packets and forward them.
@@ -193,11 +187,7 @@ pkt_burst_5tuple_swap(struct fwd_stream *fs)
                        rte_pktmbuf_free(pkts_burst[nb_tx]);
                } while (++nb_tx < nb_rx);
        }
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       end_tsc = rte_rdtsc();
-       core_cycles = (end_tsc - start_tsc);
-       fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles);
-#endif
+       get_end_cycles(fs, start_tsc);
 }
 
 struct fwd_engine five_tuple_swap_fwd_engine = {
index 0a6ed85..fc9f504 100644 (file)
@@ -529,6 +529,9 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "    Set the option to hide the zero values"
                        " for xstats display.\n"
 
+                       "set record-core-cycles on|off\n"
+                       "    Set the option to enable measurement of CPU cycles.\n"
+
                        "set port (port_id) vf (vf_id) rx|tx on|off\n"
                        "    Enable/Disable a VF receive/tranmit from a port\n\n"
 
@@ -8335,6 +8338,48 @@ cmdline_parse_inst_t cmd_set_xstats_hide_zero = {
        },
 };
 
+/* *** SET OPTION TO ENABLE MEASUREMENT OF CPU CYCLES *** */
+struct cmd_set_record_core_cycles_result {
+       cmdline_fixed_string_t keyword;
+       cmdline_fixed_string_t name;
+       cmdline_fixed_string_t on_off;
+};
+
+static void
+cmd_set_record_core_cycles_parsed(void *parsed_result,
+                       __rte_unused struct cmdline *cl,
+                       __rte_unused void *data)
+{
+       struct cmd_set_record_core_cycles_result *res;
+       uint16_t on_off = 0;
+
+       res = parsed_result;
+       on_off = !strcmp(res->on_off, "on") ? 1 : 0;
+       set_record_core_cycles(on_off);
+}
+
+cmdline_parse_token_string_t cmd_set_record_core_cycles_keyword =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_record_core_cycles_result,
+                                keyword, "set");
+cmdline_parse_token_string_t cmd_set_record_core_cycles_name =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_record_core_cycles_result,
+                                name, "record-core-cycles");
+cmdline_parse_token_string_t cmd_set_record_core_cycles_on_off =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_record_core_cycles_result,
+                                on_off, "on#off");
+
+cmdline_parse_inst_t cmd_set_record_core_cycles = {
+       .f = cmd_set_record_core_cycles_parsed,
+       .data = NULL,
+       .help_str = "set record-core-cycles on|off",
+       .tokens = {
+               (void *)&cmd_set_record_core_cycles_keyword,
+               (void *)&cmd_set_record_core_cycles_name,
+               (void *)&cmd_set_record_core_cycles_on_off,
+               NULL,
+       },
+};
+
 /* *** CONFIGURE UNICAST HASH TABLE *** */
 struct cmd_set_uc_hash_table {
        cmdline_fixed_string_t set;
@@ -19487,6 +19532,7 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_set_fwd_eth_peer,
        (cmdline_parse_inst_t *)&cmd_set_qmap,
        (cmdline_parse_inst_t *)&cmd_set_xstats_hide_zero,
+       (cmdline_parse_inst_t *)&cmd_set_record_core_cycles,
        (cmdline_parse_inst_t *)&cmd_operate_port,
        (cmdline_parse_inst_t *)&cmd_operate_specific_port,
        (cmdline_parse_inst_t *)&cmd_operate_attach_port,
index 30bee33..7a7e3f0 100644 (file)
@@ -3680,6 +3680,12 @@ set_xstats_hide_zero(uint8_t on_off)
        xstats_hide_zero = on_off;
 }
 
+void
+set_record_core_cycles(uint8_t on_off)
+{
+       record_core_cycles = on_off;
+}
+
 static inline void
 print_fdir_mask(struct rte_eth_fdir_masks *mask)
 {
index 0a96b24..836bafa 100644 (file)
@@ -789,15 +789,9 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
        uint16_t nb_segments = 0;
        int ret;
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       uint64_t start_tsc;
-       uint64_t end_tsc;
-       uint64_t core_cycles;
-#endif
+       uint64_t start_tsc = 0;
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       start_tsc = rte_rdtsc();
-#endif
+       get_start_cycles(&start_tsc);
 
        /* receive a burst of packet */
        nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue, pkts_burst,
@@ -1098,11 +1092,7 @@ tunnel_update:
                } while (++nb_tx < nb_rx);
        }
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       end_tsc = rte_rdtsc();
-       core_cycles = (end_tsc - start_tsc);
-       fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles);
-#endif
+       get_end_cycles(fs, start_tsc);
 }
 
 struct fwd_engine csum_fwd_engine = {
index 4bd351e..e92a0ee 100644 (file)
@@ -97,16 +97,10 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
        uint16_t i;
        uint32_t retry;
        uint64_t tx_offloads;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       uint64_t start_tsc;
-       uint64_t end_tsc;
-       uint64_t core_cycles;
-#endif
+       uint64_t start_tsc = 0;
        static int next_flow = 0;
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       start_tsc = rte_rdtsc();
-#endif
+       get_start_cycles(&start_tsc);
 
        /* Receive a burst of packets and discard them. */
        nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue, pkts_burst,
@@ -207,11 +201,8 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
                        rte_pktmbuf_free(pkts_burst[nb_tx]);
                } while (++nb_tx < nb_pkt);
        }
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       end_tsc = rte_rdtsc();
-       core_cycles = (end_tsc - start_tsc);
-       fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles);
-#endif
+
+       get_end_cycles(fs, start_tsc);
 }
 
 struct fwd_engine flow_gen_engine = {
index 78e3adf..3f27e8c 100644 (file)
@@ -293,15 +293,9 @@ reply_to_icmp_echo_rqsts(struct fwd_stream *fs)
        uint32_t cksum;
        uint8_t  i;
        int l2_len;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       uint64_t start_tsc;
-       uint64_t end_tsc;
-       uint64_t core_cycles;
-#endif
+       uint64_t start_tsc = 0;
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       start_tsc = rte_rdtsc();
-#endif
+       get_start_cycles(&start_tsc);
 
        /*
         * First, receive a burst of packets.
@@ -520,11 +514,7 @@ reply_to_icmp_echo_rqsts(struct fwd_stream *fs)
                }
        }
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       end_tsc = rte_rdtsc();
-       core_cycles = (end_tsc - start_tsc);
-       fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles);
-#endif
+       get_end_cycles(fs, start_tsc);
 }
 
 struct fwd_engine icmp_echo_engine = {
index 22b59bb..456f7b5 100644 (file)
@@ -50,16 +50,9 @@ pkt_burst_io_forward(struct fwd_stream *fs)
        uint16_t nb_rx;
        uint16_t nb_tx;
        uint32_t retry;
+       uint64_t start_tsc = 0;
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       uint64_t start_tsc;
-       uint64_t end_tsc;
-       uint64_t core_cycles;
-#endif
-
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       start_tsc = rte_rdtsc();
-#endif
+       get_start_cycles(&start_tsc);
 
        /*
         * Receive a burst of packets and forward them.
@@ -96,11 +89,8 @@ pkt_burst_io_forward(struct fwd_stream *fs)
                        rte_pktmbuf_free(pkts_burst[nb_tx]);
                } while (++nb_tx < nb_rx);
        }
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       end_tsc = rte_rdtsc();
-       core_cycles = (end_tsc - start_tsc);
-       fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles);
-#endif
+
+       get_end_cycles(fs, start_tsc);
 }
 
 struct fwd_engine io_fwd_engine = {
index 0a89d94..6a77568 100644 (file)
@@ -56,15 +56,9 @@ pkt_burst_mac_forward(struct fwd_stream *fs)
        uint16_t i;
        uint64_t ol_flags = 0;
        uint64_t tx_offloads;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       uint64_t start_tsc;
-       uint64_t end_tsc;
-       uint64_t core_cycles;
-#endif
+       uint64_t start_tsc = 0;
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       start_tsc = rte_rdtsc();
-#endif
+       get_start_cycles(&start_tsc);
 
        /*
         * Receive a burst of packets and forward them.
@@ -126,11 +120,8 @@ pkt_burst_mac_forward(struct fwd_stream *fs)
                        rte_pktmbuf_free(pkts_burst[nb_tx]);
                } while (++nb_tx < nb_rx);
        }
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       end_tsc = rte_rdtsc();
-       core_cycles = (end_tsc - start_tsc);
-       fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles);
-#endif
+
+       get_end_cycles(fs, start_tsc);
 }
 
 struct fwd_engine mac_fwd_engine = {
index fbe8cb3..aaef5b0 100644 (file)
@@ -57,15 +57,9 @@ pkt_burst_mac_swap(struct fwd_stream *fs)
        uint16_t nb_rx;
        uint16_t nb_tx;
        uint32_t retry;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       uint64_t start_tsc;
-       uint64_t end_tsc;
-       uint64_t core_cycles;
-#endif
+       uint64_t start_tsc = 0;
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       start_tsc = rte_rdtsc();
-#endif
+       get_start_cycles(&start_tsc);
 
        /*
         * Receive a burst of packets and forward them.
@@ -105,11 +99,7 @@ pkt_burst_mac_swap(struct fwd_stream *fs)
                        rte_pktmbuf_free(pkts_burst[nb_tx]);
                } while (++nb_tx < nb_rx);
        }
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       end_tsc = rte_rdtsc();
-       core_cycles = (end_tsc - start_tsc);
-       fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles);
-#endif
+       get_end_cycles(fs, start_tsc);
 }
 
 struct fwd_engine mac_swap_engine = {
index 7cb0e3d..76072ae 100644 (file)
@@ -70,7 +70,7 @@ usage(char* progname)
               "--rxpt= | --rxht= | --rxwt= | --rxfreet= | "
               "--txpt= | --txht= | --txwt= | --txfreet= | "
               "--txrst= | --tx-offloads= | | --rx-offloads= | "
-              "--vxlan-gpe-port= ]\n",
+              "--vxlan-gpe-port= | --record-core-cycles]\n",
               progname);
 #ifdef RTE_LIBRTE_CMDLINE
        printf("  --interactive: run in interactive mode.\n");
@@ -216,6 +216,7 @@ usage(char* progname)
               "valid only with --mp-alloc=anon\n");
        printf("  --rx-mq-mode=0xX: hexadecimal bitmask of RX mq mode can be "
               "enabled\n");
+       printf("  --record-core-cycles: enable measurement of CPU cycles.\n");
 }
 
 #ifdef RTE_LIBRTE_CMDLINE
@@ -677,6 +678,7 @@ launch_args_parse(int argc, char** argv)
                { "noisy-lkup-num-reads-writes", 1, 0, 0 },
                { "no-iova-contig",             0, 0, 0 },
                { "rx-mq-mode",                 1, 0, 0 },
+               { "record-core-cycles",         0, 0, 0 },
                { 0, 0, 0, 0 },
        };
 
@@ -1381,6 +1383,8 @@ launch_args_parse(int argc, char** argv)
                                                 "rx-mq-mode must be >= 0 and <= %d\n",
                                                 ETH_MQ_RX_VMDQ_DCB_RSS);
                        }
+                       if (!strcmp(lgopts[opt_idx].name, "record-core-cycles"))
+                               record_core_cycles = 1;
                        break;
                case 'h':
                        usage(argv[0]);
index 18d59a6..b6c8b8c 100644 (file)
@@ -49,14 +49,9 @@ pkt_burst_receive(struct fwd_stream *fs)
        struct rte_mbuf  *pkts_burst[MAX_PKT_BURST];
        uint16_t nb_rx;
        uint16_t i;
+       uint64_t start_tsc = 0;
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       uint64_t start_tsc;
-       uint64_t end_tsc;
-       uint64_t core_cycles;
-
-       start_tsc = rte_rdtsc();
-#endif
+       get_start_cycles(&start_tsc);
 
        /*
         * Receive a burst of packets.
@@ -73,11 +68,7 @@ pkt_burst_receive(struct fwd_stream *fs)
        for (i = 0; i < nb_rx; i++)
                rte_pktmbuf_free(pkts_burst[i]);
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       end_tsc = rte_rdtsc();
-       core_cycles = (end_tsc - start_tsc);
-       fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles);
-#endif
+       get_end_cycles(fs, start_tsc);
 }
 
 struct fwd_engine rx_only_engine = {
index 7842c3b..f327b16 100644 (file)
@@ -475,6 +475,11 @@ uint16_t nb_rx_queue_stats_mappings = 0;
  */
 uint8_t xstats_hide_zero;
 
+/*
+ * Measure of CPU cycles disabled by default
+ */
+uint8_t record_core_cycles;
+
 unsigned int num_sockets = 0;
 unsigned int socket_ids[RTE_MAX_NUMA_NODES];
 
@@ -1800,9 +1805,7 @@ fwd_stats_display(void)
        uint64_t total_tx_dropped = 0;
        uint64_t total_rx_nombuf = 0;
        struct rte_eth_stats stats;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
        uint64_t fwd_cycles = 0;
-#endif
        uint64_t total_recv = 0;
        uint64_t total_xmit = 0;
        struct rte_port *port;
@@ -1830,9 +1833,8 @@ fwd_stats_display(void)
                ports_stats[fs->rx_port].rx_bad_outer_l4_csum +=
                                fs->rx_bad_outer_l4_csum;
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-               fwd_cycles += fs->core_cycles;
-#endif
+               if (record_core_cycles)
+                       fwd_cycles += fs->core_cycles;
        }
        for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
                uint8_t j;
@@ -1961,24 +1963,24 @@ fwd_stats_display(void)
        printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
               "%s\n",
               acc_stats_border, acc_stats_border);
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+       if (record_core_cycles) {
 #define CYC_PER_MHZ 1E6
-       if (total_recv > 0 || total_xmit > 0) {
-               uint64_t total_pkts = 0;
-               if (strcmp(cur_fwd_eng->fwd_mode_name, "txonly") == 0 ||
-                   strcmp(cur_fwd_eng->fwd_mode_name, "flowgen") == 0)
-                       total_pkts = total_xmit;
-               else
-                       total_pkts = total_recv;
+               if (total_recv > 0 || total_xmit > 0) {
+                       uint64_t total_pkts = 0;
+                       if (strcmp(cur_fwd_eng->fwd_mode_name, "txonly") == 0 ||
+                           strcmp(cur_fwd_eng->fwd_mode_name, "flowgen") == 0)
+                               total_pkts = total_xmit;
+                       else
+                               total_pkts = total_recv;
 
-               printf("\n  CPU cycles/packet=%.2F (total cycles="
-                      "%"PRIu64" / total %s packets=%"PRIu64") at %"PRIu64
-                      " MHz Clock\n",
-                      (double) fwd_cycles / total_pkts,
-                      fwd_cycles, cur_fwd_eng->fwd_mode_name, total_pkts,
-                      (uint64_t)(rte_get_tsc_hz() / CYC_PER_MHZ));
+                       printf("\n  CPU cycles/packet=%.2F (total cycles="
+                              "%"PRIu64" / total %s packets=%"PRIu64") at %"PRIu64
+                              " MHz Clock\n",
+                              (double) fwd_cycles / total_pkts,
+                              fwd_cycles, cur_fwd_eng->fwd_mode_name, total_pkts,
+                              (uint64_t)(rte_get_tsc_hz() / CYC_PER_MHZ));
+               }
        }
-#endif
 }
 
 void
@@ -2006,9 +2008,7 @@ fwd_stats_reset(void)
                memset(&fs->rx_burst_stats, 0, sizeof(fs->rx_burst_stats));
                memset(&fs->tx_burst_stats, 0, sizeof(fs->tx_burst_stats));
 #endif
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
                fs->core_cycles = 0;
-#endif
        }
 }
 
index 25a12b1..dcc37be 100644 (file)
@@ -129,9 +129,7 @@ struct fwd_stream {
        uint64_t rx_bad_outer_l4_csum;
        /**< received packets has bad outer l4 checksum */
        unsigned int gro_times; /**< GRO operation times */
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
        uint64_t     core_cycles; /**< used for RX and TX processing */
-#endif
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
        struct pkt_burst_stats rx_burst_stats;
        struct pkt_burst_stats tx_burst_stats;
@@ -301,6 +299,7 @@ extern uint16_t nb_rx_queue_stats_mappings;
 extern uint8_t xstats_hide_zero; /**< Hide zero values for xstats display */
 
 /* globals used for configuration */
+extern uint8_t record_core_cycles; /**< Enables measurement of CPU cycles */
 extern uint16_t verbose_level; /**< Drives messages being displayed, if any. */
 extern int testpmd_logtype; /**< Log type for testpmd logs */
 extern uint8_t  interactive;
@@ -681,6 +680,20 @@ port_pci_reg_write(struct rte_port *port, uint32_t reg_off, uint32_t reg_v)
 #define port_id_pci_reg_write(pt_id, reg_off, reg_value) \
        port_pci_reg_write(&ports[(pt_id)], (reg_off), (reg_value))
 
+static inline void
+get_start_cycles(uint64_t *start_tsc)
+{
+       if (record_core_cycles)
+               *start_tsc = rte_rdtsc();
+}
+
+static inline void
+get_end_cycles(struct fwd_stream *fs, uint64_t start_tsc)
+{
+       if (record_core_cycles)
+               fs->core_cycles += rte_rdtsc() - start_tsc;
+}
+
 /* Prototypes */
 unsigned int parse_item_list(char* str, const char* item_name,
                        unsigned int max_items,
@@ -772,6 +785,7 @@ void set_qmap(portid_t port_id, uint8_t is_rx, uint16_t queue_id, uint8_t map_va
 
 void set_xstats_hide_zero(uint8_t on_off);
 
+void set_record_core_cycles(uint8_t on_off);
 void set_verbose_level(uint16_t vb_level);
 void set_tx_pkt_segments(unsigned *seg_lengths, unsigned nb_segs);
 void show_tx_pkt_segments(void);
index 3bae367..2f20112 100644 (file)
@@ -299,15 +299,9 @@ pkt_burst_transmit(struct fwd_stream *fs)
        uint32_t retry;
        uint64_t ol_flags = 0;
        uint64_t tx_offloads;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       uint64_t start_tsc;
-       uint64_t end_tsc;
-       uint64_t core_cycles;
-#endif
+       uint64_t start_tsc = 0;
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       start_tsc = rte_rdtsc();
-#endif
+       get_start_cycles(&start_tsc);
 
        mbp = current_fwd_lcore()->mbp;
        txp = &ports[fs->tx_port];
@@ -396,11 +390,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
                } while (++nb_tx < nb_pkt);
        }
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       end_tsc = rte_rdtsc();
-       core_cycles = (end_tsc - start_tsc);
-       fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles);
-#endif
+       get_end_cycles(fs, start_tsc);
 }
 
 static void
index d1e4ee3..00bacb2 100644 (file)
@@ -489,3 +489,7 @@ The command line options are:
     The default value is 0x7::
 
        ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_DCB_FLAG | ETH_MQ_RX_VMDQ_FLAG
+
+*   ``--record-core-cycles``
+
+    Enable measurement of CPU cycles per packet.
index 90cf252..59d052c 100644 (file)
@@ -710,6 +710,21 @@ Set the forwarding ports hexadecimal mask::
 
 This is equivalent to the ``--portmask`` command-line option.
 
+set record-core-cycles
+~~~~~~~~~~~~~~~~~~~~~~
+
+Set the recording of CPU cycles::
+
+   testpmd> set record-core-cycles (on|off)
+
+Where:
+
+* ``on`` enables measurement of CPU cycles per packet.
+
+* ``off`` disables measurement of CPU cycles per packet.
+
+This is equivalent to the ``--record-core-cycles command-line`` option.
+
 set burst
 ~~~~~~~~~