X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest-pmd%2Ftestpmd.c;h=fb286b86e51bb110538caaf2638d29eeac3bd43c;hb=e04449488fdb1ed4d94a2bd1e7f24dfeed84d862;hp=b112f839707b6fbcca262c7f067db397faa1c619;hpb=4c0497b1dd531c3f72e8cbfab32e32350a9cbfa5;p=dpdk.git diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index b112f83970..fb286b86e5 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -179,9 +179,7 @@ struct fwd_engine * fwd_engines[] = { &csum_fwd_engine, &icmp_echo_engine, &noisy_vnf_engine, -#if defined RTE_LIBRTE_PMD_SOFTNIC - &softnic_fwd_engine, -#endif + &five_tuple_swap_fwd_engine, #ifdef RTE_LIBRTE_IEEE1588 &ieee1588_fwd_engine, #endif @@ -223,6 +221,12 @@ enum tx_pkt_split tx_pkt_split = TX_PKT_SPLIT_OFF; uint8_t txonly_multi_flow; /**< Whether multiple flows are generated in TXONLY mode. */ +uint32_t tx_pkt_times_inter; +/**< Timings for send scheduling in TXONLY mode, time between bursts. */ + +uint32_t tx_pkt_times_intra; +/**< Timings for send scheduling in TXONLY mode, time between packets. */ + uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per burst. */ uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of mbuf mempool cache. */ @@ -471,6 +475,16 @@ 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; + +/* + * Display of RX and TX bursts disabled by default + */ +uint8_t record_burst_stats; + unsigned int num_sockets = 0; unsigned int socket_ids[RTE_MAX_NUMA_NODES]; @@ -1561,19 +1575,6 @@ init_config(void) "rte_gro_ctx_create() failed\n"); } } - -#if defined RTE_LIBRTE_PMD_SOFTNIC - if (strcmp(cur_fwd_eng->fwd_mode_name, "softnic") == 0) { - RTE_ETH_FOREACH_DEV(pid) { - port = &ports[pid]; - const char *driver = port->dev_info.driver_name; - - if (strcmp(driver, "net_softnic") == 0) - port->softport.fwd_lcore_arg = fwd_lcores; - } - } -#endif - } @@ -1688,63 +1689,72 @@ init_fwd_streams(void) return 0; } -#ifdef RTE_TEST_PMD_RECORD_BURST_STATS static void pkt_burst_stats_display(const char *rx_tx, struct pkt_burst_stats *pbs) { - unsigned int total_burst; - unsigned int nb_burst; - unsigned int burst_stats[3]; - uint16_t pktnb_stats[3]; + uint64_t total_burst, sburst; + uint64_t nb_burst; + uint64_t burst_stats[4]; + uint16_t pktnb_stats[4]; uint16_t nb_pkt; - int burst_percent[3]; + int burst_percent[4], sburstp; + int i; /* * First compute the total number of packet bursts and the * two highest numbers of bursts of the same number of packets. */ - total_burst = 0; - burst_stats[0] = burst_stats[1] = burst_stats[2] = 0; - pktnb_stats[0] = pktnb_stats[1] = pktnb_stats[2] = 0; - for (nb_pkt = 0; nb_pkt < MAX_PKT_BURST; nb_pkt++) { + memset(&burst_stats, 0x0, sizeof(burst_stats)); + memset(&pktnb_stats, 0x0, sizeof(pktnb_stats)); + + /* Show stats for 0 burst size always */ + total_burst = pbs->pkt_burst_spread[0]; + burst_stats[0] = pbs->pkt_burst_spread[0]; + pktnb_stats[0] = 0; + + /* Find the next 2 burst sizes with highest occurrences. */ + for (nb_pkt = 1; nb_pkt < MAX_PKT_BURST; nb_pkt++) { nb_burst = pbs->pkt_burst_spread[nb_pkt]; + if (nb_burst == 0) continue; + total_burst += nb_burst; - if (nb_burst > burst_stats[0]) { - burst_stats[1] = burst_stats[0]; - pktnb_stats[1] = pktnb_stats[0]; - burst_stats[0] = nb_burst; - pktnb_stats[0] = nb_pkt; - } else if (nb_burst > burst_stats[1]) { + + if (nb_burst > burst_stats[1]) { + burst_stats[2] = burst_stats[1]; + pktnb_stats[2] = pktnb_stats[1]; burst_stats[1] = nb_burst; pktnb_stats[1] = nb_pkt; + } else if (nb_burst > burst_stats[2]) { + burst_stats[2] = nb_burst; + pktnb_stats[2] = nb_pkt; } } if (total_burst == 0) return; - burst_percent[0] = (burst_stats[0] * 100) / total_burst; - printf(" %s-bursts : %u [%d%% of %d pkts", rx_tx, total_burst, - burst_percent[0], (int) pktnb_stats[0]); - if (burst_stats[0] == total_burst) { - printf("]\n"); - return; - } - if (burst_stats[0] + burst_stats[1] == total_burst) { - printf(" + %d%% of %d pkts]\n", - 100 - burst_percent[0], pktnb_stats[1]); - return; - } - burst_percent[1] = (burst_stats[1] * 100) / total_burst; - burst_percent[2] = 100 - (burst_percent[0] + burst_percent[1]); - if ((burst_percent[1] == 0) || (burst_percent[2] == 0)) { - printf(" + %d%% of others]\n", 100 - burst_percent[0]); - return; + + printf(" %s-bursts : %"PRIu64" [", rx_tx, total_burst); + for (i = 0, sburst = 0, sburstp = 0; i < 4; i++) { + if (i == 3) { + printf("%d%% of other]\n", 100 - sburstp); + return; + } + + sburst += burst_stats[i]; + if (sburst == total_burst) { + printf("%d%% of %d pkts]\n", + 100 - sburstp, (int) pktnb_stats[i]); + return; + } + + burst_percent[i] = + (double)burst_stats[i] / total_burst * 100; + printf("%d%% of %d pkts + ", + burst_percent[i], (int) pktnb_stats[i]); + sburstp += burst_percent[i]; } - printf(" + %d%% of %d pkts + %d%% of others]\n", - burst_percent[1], (int) pktnb_stats[1], burst_percent[2]); } -#endif /* RTE_TEST_PMD_RECORD_BURST_STATS */ static void fwd_stream_stats_display(streamid_t stream_id) @@ -1775,10 +1785,10 @@ fwd_stream_stats_display(streamid_t stream_id) printf("\n"); } -#ifdef RTE_TEST_PMD_RECORD_BURST_STATS - pkt_burst_stats_display("RX", &fs->rx_burst_stats); - pkt_burst_stats_display("TX", &fs->tx_burst_stats); -#endif + if (record_burst_stats) { + pkt_burst_stats_display("RX", &fs->rx_burst_stats); + pkt_burst_stats_display("TX", &fs->tx_burst_stats); + } } void @@ -1798,9 +1808,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; @@ -1828,9 +1836,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; @@ -1911,14 +1918,14 @@ fwd_stats_display(void) stats.opackets + ports_stats[pt_id].tx_dropped); } -#ifdef RTE_TEST_PMD_RECORD_BURST_STATS - if (ports_stats[pt_id].rx_stream) - pkt_burst_stats_display("RX", - &ports_stats[pt_id].rx_stream->rx_burst_stats); - if (ports_stats[pt_id].tx_stream) - pkt_burst_stats_display("TX", - &ports_stats[pt_id].tx_stream->tx_burst_stats); -#endif + if (record_burst_stats) { + if (ports_stats[pt_id].rx_stream) + pkt_burst_stats_display("RX", + &ports_stats[pt_id].rx_stream->rx_burst_stats); + if (ports_stats[pt_id].tx_stream) + pkt_burst_stats_display("TX", + &ports_stats[pt_id].tx_stream->tx_burst_stats); + } if (port->rx_queue_stats_mapping_enabled) { printf("\n"); @@ -1959,16 +1966,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) - printf("\n CPU cycles/packet=%u (total cycles=" - "%"PRIu64" / total RX packets=%"PRIu64") at %"PRIu64 - " MHz Clock\n", - (unsigned int)(fwd_cycles / total_recv), - fwd_cycles, total_recv, - (uint64_t)(rte_get_tsc_hz() / CYC_PER_MHZ)); -#endif + 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)); + } + } } void @@ -1992,13 +2007,9 @@ fwd_stats_reset(void) fs->rx_bad_l4_csum = 0; fs->rx_bad_outer_l4_csum = 0; -#ifdef RTE_TEST_PMD_RECORD_BURST_STATS 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 } } @@ -3460,6 +3471,8 @@ get_eth_dcb_conf(portid_t pid, struct rte_eth_conf *eth_conf, struct rte_eth_dcb_tx_conf *tx_conf = ð_conf->tx_adv_conf.dcb_tx_conf; + memset(&rss_conf, 0, sizeof(struct rte_eth_rss_conf)); + rc = rte_eth_dev_rss_hash_conf_get(pid, &rss_conf); if (rc != 0) return rc;