X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=app%2Ftest-pmd%2Fparameters.c;h=641c9c767ef4d5ee5cf9f4f20d155a52709e98e2;hb=f7352c176bbf131728445680ee08961a67cc09a6;hp=7c13210f04aa311a0851b6ec26abd6f67ce0113e;hpb=61a3b0e5e79fcd103d786d8170edf20d02049b37;p=dpdk.git diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index 7c13210f04..641c9c767e 100644 --- a/app/test-pmd/parameters.c +++ b/app/test-pmd/parameters.c @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -38,9 +37,6 @@ #include #include #include -#ifdef RTE_NET_BOND -#include -#endif #include #include "testpmd.h" @@ -61,6 +57,10 @@ usage(char* progname) "(only if interactive is disabled).\n"); printf(" --stats-period=PERIOD: statistics will be shown " "every PERIOD seconds (only if interactive is disabled).\n"); + printf(" --display-xstats xstat_name1[,...]: comma-separated list of " + "extended statistics to show. Used with --stats-period " + "specified or interactive commands that show Rx/Tx statistics " + "(i.e. 'show port stats').\n"); printf(" --nb-cores=N: set the number of forwarding cores " "(1 <= N <= %d).\n", nb_lcores); printf(" --nb-ports=N: set the number of forwarding ports " @@ -110,7 +110,7 @@ usage(char* progname) "If the drop-queue doesn't exist, the packet is dropped. " "By default drop-queue=127.\n"); #ifdef RTE_LIB_LATENCYSTATS - printf(" --latencystats=N: enable latency and jitter statistcs " + printf(" --latencystats=N: enable latency and jitter statistics " "monitoring on forwarding lcore id N.\n"); #endif printf(" --disable-crc-strip: disable CRC stripping by hardware.\n"); @@ -143,6 +143,7 @@ usage(char* progname) "N.\n"); printf(" --burst=N: set the number of packets per burst to N.\n"); printf(" --flowgen-clones=N: set the number of single packet clones to send in flowgen mode. Should be less than burst value.\n"); + printf(" --flowgen-flows=N: set the number of flows in flowgen mode to N (1 <= N <= INT32_MAX).\n"); printf(" --mbcache=N: set the cache of mbuf memory pool to N.\n"); printf(" --rxpt=N: set prefetch threshold register of RX rings to N.\n"); printf(" --rxht=N: set the host threshold register of RX rings to N.\n"); @@ -166,6 +167,7 @@ usage(char* progname) printf(" --tx-ip=src,dst: IP addresses in Tx-only mode\n"); printf(" --tx-udp=src[,dst]: UDP ports in Tx-only mode\n"); printf(" --eth-link-speed: force link speed.\n"); + printf(" --rxq-share=X: number of ports per shared Rx queue groups, defaults to UINT32_MAX (1 group)\n"); printf(" --disable-link-check: disable check on link status when " "starting/stopping ports.\n"); printf(" --disable-device-start: do not automatically start port\n"); @@ -472,32 +474,98 @@ parse_event_printing_config(const char *optarg, int enable) return 0; } +static int +parse_xstats_list(const char *in_str, struct rte_eth_xstat_name **xstats, + unsigned int *xstats_num) +{ + int max_names_nb, names_nb, nonempty_names_nb; + int name, nonempty_name; + int stringlen; + char **names; + char *str; + int ret; + int i; + + names = NULL; + str = strdup(in_str); + if (str == NULL) { + ret = -ENOMEM; + goto out; + } + stringlen = strlen(str); + + for (i = 0, max_names_nb = 1; str[i] != '\0'; i++) { + if (str[i] == ',') + max_names_nb++; + } + + names = calloc(max_names_nb, sizeof(*names)); + if (names == NULL) { + ret = -ENOMEM; + goto out; + } + + names_nb = rte_strsplit(str, stringlen, names, max_names_nb, ','); + if (names_nb < 0) { + ret = -EINVAL; + goto out; + } + + nonempty_names_nb = 0; + for (i = 0; i < names_nb; i++) { + if (names[i][0] == '\0') + continue; + nonempty_names_nb++; + } + *xstats = calloc(nonempty_names_nb, sizeof(**xstats)); + if (*xstats == NULL) { + ret = -ENOMEM; + goto out; + } + + for (name = nonempty_name = 0; name < names_nb; name++) { + if (names[name][0] == '\0') + continue; + rte_strscpy((*xstats)[nonempty_name].name, names[name], + sizeof((*xstats)[nonempty_name].name)); + nonempty_name++; + } + + *xstats_num = nonempty_names_nb; + ret = 0; + +out: + free(names); + free(str); + return ret; +} + static int parse_link_speed(int n) { - uint32_t speed = ETH_LINK_SPEED_FIXED; + uint32_t speed = RTE_ETH_LINK_SPEED_FIXED; switch (n) { case 1000: - speed |= ETH_LINK_SPEED_1G; + speed |= RTE_ETH_LINK_SPEED_1G; break; case 10000: - speed |= ETH_LINK_SPEED_10G; + speed |= RTE_ETH_LINK_SPEED_10G; break; case 25000: - speed |= ETH_LINK_SPEED_25G; + speed |= RTE_ETH_LINK_SPEED_25G; break; case 40000: - speed |= ETH_LINK_SPEED_40G; + speed |= RTE_ETH_LINK_SPEED_40G; break; case 50000: - speed |= ETH_LINK_SPEED_50G; + speed |= RTE_ETH_LINK_SPEED_50G; break; case 100000: - speed |= ETH_LINK_SPEED_100G; + speed |= RTE_ETH_LINK_SPEED_100G; break; case 200000: - speed |= ETH_LINK_SPEED_200G; + speed |= RTE_ETH_LINK_SPEED_200G; break; case 100: case 10: @@ -512,6 +580,9 @@ parse_link_speed(int n) void launch_args_parse(int argc, char** argv) { +#define PARAM_PROC_ID "proc-id" +#define PARAM_NUM_PROCS "num-procs" + int n, opt; char **argvopt; int opt_idx; @@ -535,6 +606,7 @@ launch_args_parse(int argc, char** argv) #endif { "tx-first", 0, 0, 0 }, { "stats-period", 1, 0, 0 }, + { "display-xstats", 1, 0, 0 }, { "nb-cores", 1, 0, 0 }, { "nb-ports", 1, 0, 0 }, { "coremask", 1, 0, 0 }, @@ -586,6 +658,7 @@ launch_args_parse(int argc, char** argv) { "hairpin-mode", 1, 0, 0 }, { "burst", 1, 0, 0 }, { "flowgen-clones", 1, 0, 0 }, + { "flowgen-flows", 1, 0, 0 }, { "mbcache", 1, 0, 0 }, { "txpt", 1, 0, 0 }, { "txht", 1, 0, 0 }, @@ -602,6 +675,7 @@ launch_args_parse(int argc, char** argv) { "rxpkts", 1, 0, 0 }, { "txpkts", 1, 0, 0 }, { "txonly-multi-flow", 0, 0, 0 }, + { "rxq-share", 2, 0, 0 }, { "eth-link-speed", 1, 0, 0 }, { "disable-link-check", 0, 0, 0 }, { "disable-device-start", 0, 0, 0 }, @@ -631,6 +705,8 @@ launch_args_parse(int argc, char** argv) { "rx-mq-mode", 1, 0, 0 }, { "record-core-cycles", 0, 0, 0 }, { "record-burst-stats", 0, 0, 0 }, + { PARAM_NUM_PROCS, 1, 0, 0 }, + { PARAM_PROC_ID, 1, 0, 0 }, { 0, 0, 0, 0 }, }; @@ -692,6 +768,16 @@ launch_args_parse(int argc, char** argv) stats_period = n; break; } + if (!strcmp(lgopts[opt_idx].name, "display-xstats")) { + char rc; + + rc = parse_xstats_list(optarg, &xstats_display, + &xstats_display_num); + if (rc != 0) + rte_exit(EXIT_FAILURE, + "Failed to parse display-xstats argument: %d\n", + rc); + } if (!strcmp(lgopts[opt_idx].name, "eth-peers-configfile")) { if (init_peer_eth_addrs(optarg) != 0) @@ -854,16 +940,17 @@ launch_args_parse(int argc, char** argv) } if (!strcmp(lgopts[opt_idx].name, "total-num-mbufs")) { n = atoi(optarg); - if (n > 1024) + if (n > MIN_TOTAL_NUM_MBUFS) param_total_num_mbufs = (unsigned)n; else rte_exit(EXIT_FAILURE, - "total-num-mbufs should be > 1024\n"); + "total-num-mbufs should be > %d\n", + MIN_TOTAL_NUM_MBUFS); } if (!strcmp(lgopts[opt_idx].name, "max-pkt-len")) { n = atoi(optarg); if (n >= RTE_ETHER_MIN_LEN) - rx_mode.max_rx_pkt_len = (uint32_t) n; + max_rx_pkt_len = n; else rte_exit(EXIT_FAILURE, "Invalid max-pkt-len=%d - should be > %d\n", @@ -912,13 +999,13 @@ launch_args_parse(int argc, char** argv) if (!strcmp(lgopts[opt_idx].name, "pkt-filter-size")) { if (!strcmp(optarg, "64K")) fdir_conf.pballoc = - RTE_FDIR_PBALLOC_64K; + RTE_ETH_FDIR_PBALLOC_64K; else if (!strcmp(optarg, "128K")) fdir_conf.pballoc = - RTE_FDIR_PBALLOC_128K; + RTE_ETH_FDIR_PBALLOC_128K; else if (!strcmp(optarg, "256K")) fdir_conf.pballoc = - RTE_FDIR_PBALLOC_256K; + RTE_ETH_FDIR_PBALLOC_256K; else rte_exit(EXIT_FAILURE, "pkt-filter-size %s invalid -" " must be: 64K or 128K or 256K\n", @@ -960,34 +1047,34 @@ launch_args_parse(int argc, char** argv) } #endif if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip")) - rx_offloads |= DEV_RX_OFFLOAD_KEEP_CRC; + rx_offloads |= RTE_ETH_RX_OFFLOAD_KEEP_CRC; if (!strcmp(lgopts[opt_idx].name, "enable-lro")) - rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO; + rx_offloads |= RTE_ETH_RX_OFFLOAD_TCP_LRO; if (!strcmp(lgopts[opt_idx].name, "enable-scatter")) - rx_offloads |= DEV_RX_OFFLOAD_SCATTER; + rx_offloads |= RTE_ETH_RX_OFFLOAD_SCATTER; if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum")) - rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM; + rx_offloads |= RTE_ETH_RX_OFFLOAD_CHECKSUM; if (!strcmp(lgopts[opt_idx].name, "enable-rx-timestamp")) - rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP; + rx_offloads |= RTE_ETH_RX_OFFLOAD_TIMESTAMP; if (!strcmp(lgopts[opt_idx].name, "enable-hw-vlan")) - rx_offloads |= DEV_RX_OFFLOAD_VLAN; + rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN; if (!strcmp(lgopts[opt_idx].name, "enable-hw-vlan-filter")) - rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER; + rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_FILTER; if (!strcmp(lgopts[opt_idx].name, "enable-hw-vlan-strip")) - rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP; + rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_STRIP; if (!strcmp(lgopts[opt_idx].name, "enable-hw-vlan-extend")) - rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND; + rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_EXTEND; if (!strcmp(lgopts[opt_idx].name, "enable-hw-qinq-strip")) - rx_offloads |= DEV_RX_OFFLOAD_QINQ_STRIP; + rx_offloads |= RTE_ETH_RX_OFFLOAD_QINQ_STRIP; if (!strcmp(lgopts[opt_idx].name, "enable-drop-en")) rx_drop_en = 1; @@ -1009,13 +1096,13 @@ launch_args_parse(int argc, char** argv) if (!strcmp(lgopts[opt_idx].name, "forward-mode")) set_pkt_forwarding_mode(optarg); if (!strcmp(lgopts[opt_idx].name, "rss-ip")) - rss_hf = ETH_RSS_IP; + rss_hf = RTE_ETH_RSS_IP; if (!strcmp(lgopts[opt_idx].name, "rss-udp")) - rss_hf = ETH_RSS_UDP; + rss_hf = RTE_ETH_RSS_UDP; if (!strcmp(lgopts[opt_idx].name, "rss-level-inner")) - rss_hf |= ETH_RSS_LEVEL_INNERMOST; + rss_hf |= RTE_ETH_RSS_LEVEL_INNERMOST; if (!strcmp(lgopts[opt_idx].name, "rss-level-outer")) - rss_hf |= ETH_RSS_LEVEL_OUTERMOST; + rss_hf |= RTE_ETH_RSS_LEVEL_OUTERMOST; if (!strcmp(lgopts[opt_idx].name, "rxq")) { n = atoi(optarg); if (n >= 0 && check_nb_rxq((queueid_t)n) == 0) @@ -1122,6 +1209,14 @@ launch_args_parse(int argc, char** argv) rte_exit(EXIT_FAILURE, "clones must be >= 0 and <= current burst\n"); } + if (!strcmp(lgopts[opt_idx].name, "flowgen-flows")) { + n = atoi(optarg); + if (n > 0) + nb_flows_flowgen = (int) n; + else + rte_exit(EXIT_FAILURE, + "flows must be >= 1\n"); + } if (!strcmp(lgopts[opt_idx].name, "mbcache")) { n = atoi(optarg); if ((n >= 0) && @@ -1256,6 +1351,17 @@ launch_args_parse(int argc, char** argv) } if (!strcmp(lgopts[opt_idx].name, "txonly-multi-flow")) txonly_multi_flow = 1; + if (!strcmp(lgopts[opt_idx].name, "rxq-share")) { + if (optarg == NULL) { + rxq_share = UINT32_MAX; + } else { + n = atoi(optarg); + if (n >= 0) + rxq_share = (uint32_t)n; + else + rte_exit(EXIT_FAILURE, "rxq-share must be >= 0\n"); + } + } if (!strcmp(lgopts[opt_idx].name, "no-flush-rx")) no_flush_rx = 1; if (!strcmp(lgopts[opt_idx].name, "eth-link-speed")) { @@ -1381,22 +1487,26 @@ launch_args_parse(int argc, char** argv) "noisy-lkup-num-reads-writes must be >= 0\n"); } if (!strcmp(lgopts[opt_idx].name, "no-iova-contig")) - mempool_flags = MEMPOOL_F_NO_IOVA_CONTIG; + mempool_flags = RTE_MEMPOOL_F_NO_IOVA_CONTIG; if (!strcmp(lgopts[opt_idx].name, "rx-mq-mode")) { char *end = NULL; n = strtoul(optarg, &end, 16); - if (n >= 0 && n <= ETH_MQ_RX_VMDQ_DCB_RSS) + if (n >= 0 && n <= RTE_ETH_MQ_RX_VMDQ_DCB_RSS) rx_mq_mode = (enum rte_eth_rx_mq_mode)n; else rte_exit(EXIT_FAILURE, "rx-mq-mode must be >= 0 and <= %d\n", - ETH_MQ_RX_VMDQ_DCB_RSS); + RTE_ETH_MQ_RX_VMDQ_DCB_RSS); } if (!strcmp(lgopts[opt_idx].name, "record-core-cycles")) record_core_cycles = 1; if (!strcmp(lgopts[opt_idx].name, "record-burst-stats")) record_burst_stats = 1; + if (!strcmp(lgopts[opt_idx].name, PARAM_NUM_PROCS)) + num_procs = atoi(optarg); + if (!strcmp(lgopts[opt_idx].name, PARAM_PROC_ID)) + proc_id = atoi(optarg); break; case 'h': usage(argv[0]); @@ -1417,11 +1527,17 @@ launch_args_parse(int argc, char** argv) rte_exit(EXIT_FAILURE, "Command line is incorrect\n"); } + if (proc_id >= (int)num_procs) + rte_exit(EXIT_FAILURE, + "The multi-process option '%s(%d)' should be less than '%s(%u)'\n", + PARAM_PROC_ID, proc_id, + PARAM_NUM_PROCS, num_procs); + /* Set offload configuration from command line parameters. */ rx_mode.offloads = rx_offloads; tx_mode.offloads = tx_offloads; - if (mempool_flags & MEMPOOL_F_NO_IOVA_CONTIG && + if (mempool_flags & RTE_MEMPOOL_F_NO_IOVA_CONTIG && mp_alloc_type != MP_ALLOC_ANON) { TESTPMD_LOG(WARNING, "cannot use no-iova-contig without " "mp-alloc=anon. mempool no-iova-contig is "