X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Fproc-info%2Fmain.c;h=abeca4aab438128ef684839857b8943e5d20ffcf;hb=e8428a9d89f14c4ee31a88b46a7a785baef29bbb;hp=ea15ae1a60ff9183465c47899f5fdce42818f316;hpb=dbc72300bcae22e0489a6b746b380821c5f579e2;p=dpdk.git diff --git a/app/proc-info/main.c b/app/proc-info/main.c index ea15ae1a60..abeca4aab4 100644 --- a/app/proc-info/main.c +++ b/app/proc-info/main.c @@ -30,9 +30,12 @@ #include #include #include +#ifdef RTE_LIBRTE_SECURITY #include +#endif #include #include +#include /* Maximum long option length for option parsing. */ #define MAX_LONG_OPT_SZ 64 @@ -80,6 +83,17 @@ static char bdr_str[MAX_STRING_LEN]; static uint32_t enable_shw_port; /**< Enable show tm. */ static uint32_t enable_shw_tm; +/**< Enable show crypto. */ +static uint32_t enable_shw_crypto; +/**< Enable show ring. */ +static uint32_t enable_shw_ring; +static char *ring_name; +/**< Enable show mempool. */ +static uint32_t enable_shw_mempool; +static char *mempool_name; +/**< Enable iter mempool. */ +static uint32_t enable_iter_mempool; +static char *mempool_iter_name; /**< display usage */ static void @@ -101,7 +115,11 @@ proc_info_usage(const char *prgname) " --collectd-format: to print statistics to STDOUT in expected by collectd format\n" " --host-id STRING: host id used to identify the system process is running on\n" " --show-port: to display ports information\n" - " --show-tm: to display traffic manager information for ports\n", + " --show-tm: to display traffic manager information for ports\n" + " --show-crypto: to display crypto information\n" + " --show-ring[=name]: to display ring information\n" + " --show-mempool[=name]: to display mempool information\n" + " --iter-mempool=name: iterate mempool elements to display content\n", prgname); } @@ -177,7 +195,7 @@ proc_info_preparse_args(int argc, char **argv) proc_info_usage(prgname); return -1; } - snprintf(host_id, sizeof(host_id), "%s", argv[i+1]); + strlcpy(host_id, argv[i + 1], sizeof(host_id)); } } @@ -185,7 +203,7 @@ proc_info_preparse_args(int argc, char **argv) int err = gethostname(host_id, MAX_LONG_OPT_SZ-1); if (err) - strcpy(host_id, "unknown"); + strlcpy(host_id, "unknown", sizeof(host_id)); } return 0; @@ -210,6 +228,10 @@ proc_info_parse_args(int argc, char **argv) {"host-id", 0, NULL, 0}, {"show-port", 0, NULL, 0}, {"show-tm", 0, NULL, 0}, + {"show-crypto", 0, NULL, 0}, + {"show-ring", optional_argument, NULL, 0}, + {"show-mempool", optional_argument, NULL, 0}, + {"iter-mempool", required_argument, NULL, 0}, {NULL, 0, 0, 0} }; @@ -259,6 +281,22 @@ proc_info_parse_args(int argc, char **argv) else if (!strncmp(long_option[option_index].name, "show-tm", MAX_LONG_OPT_SZ)) enable_shw_tm = 1; + else if (!strncmp(long_option[option_index].name, + "show-crypto", MAX_LONG_OPT_SZ)) + enable_shw_crypto = 1; + else if (!strncmp(long_option[option_index].name, + "show-ring", MAX_LONG_OPT_SZ)) { + enable_shw_ring = 1; + ring_name = optarg; + } else if (!strncmp(long_option[option_index].name, + "show-mempool", MAX_LONG_OPT_SZ)) { + enable_shw_mempool = 1; + mempool_name = optarg; + } else if (!strncmp(long_option[option_index].name, + "iter-mempool", MAX_LONG_OPT_SZ)) { + enable_iter_mempool = 1; + mempool_iter_name = optarg; + } break; case 1: /* Print xstat single value given by name*/ @@ -360,50 +398,50 @@ static void collectd_resolve_cnt_type(char *cnt_type, size_t cnt_type_len, if ((type_end != NULL) && (strncmp(cnt_name, "rx_", strlen("rx_")) == 0)) { if (strncmp(type_end, "_errors", strlen("_errors")) == 0) - strncpy(cnt_type, "if_rx_errors", cnt_type_len); + strlcpy(cnt_type, "if_rx_errors", cnt_type_len); else if (strncmp(type_end, "_dropped", strlen("_dropped")) == 0) - strncpy(cnt_type, "if_rx_dropped", cnt_type_len); + strlcpy(cnt_type, "if_rx_dropped", cnt_type_len); else if (strncmp(type_end, "_bytes", strlen("_bytes")) == 0) - strncpy(cnt_type, "if_rx_octets", cnt_type_len); + strlcpy(cnt_type, "if_rx_octets", cnt_type_len); else if (strncmp(type_end, "_packets", strlen("_packets")) == 0) - strncpy(cnt_type, "if_rx_packets", cnt_type_len); + strlcpy(cnt_type, "if_rx_packets", cnt_type_len); else if (strncmp(type_end, "_placement", strlen("_placement")) == 0) - strncpy(cnt_type, "if_rx_errors", cnt_type_len); + strlcpy(cnt_type, "if_rx_errors", cnt_type_len); else if (strncmp(type_end, "_buff", strlen("_buff")) == 0) - strncpy(cnt_type, "if_rx_errors", cnt_type_len); + strlcpy(cnt_type, "if_rx_errors", cnt_type_len); else /* Does not fit obvious type: use a more generic one */ - strncpy(cnt_type, "derive", cnt_type_len); + strlcpy(cnt_type, "derive", cnt_type_len); } else if ((type_end != NULL) && (strncmp(cnt_name, "tx_", strlen("tx_"))) == 0) { if (strncmp(type_end, "_errors", strlen("_errors")) == 0) - strncpy(cnt_type, "if_tx_errors", cnt_type_len); + strlcpy(cnt_type, "if_tx_errors", cnt_type_len); else if (strncmp(type_end, "_dropped", strlen("_dropped")) == 0) - strncpy(cnt_type, "if_tx_dropped", cnt_type_len); + strlcpy(cnt_type, "if_tx_dropped", cnt_type_len); else if (strncmp(type_end, "_bytes", strlen("_bytes")) == 0) - strncpy(cnt_type, "if_tx_octets", cnt_type_len); + strlcpy(cnt_type, "if_tx_octets", cnt_type_len); else if (strncmp(type_end, "_packets", strlen("_packets")) == 0) - strncpy(cnt_type, "if_tx_packets", cnt_type_len); + strlcpy(cnt_type, "if_tx_packets", cnt_type_len); else /* Does not fit obvious type: use a more generic one */ - strncpy(cnt_type, "derive", cnt_type_len); + strlcpy(cnt_type, "derive", cnt_type_len); } else if ((type_end != NULL) && (strncmp(cnt_name, "flow_", strlen("flow_"))) == 0) { if (strncmp(type_end, "_filters", strlen("_filters")) == 0) - strncpy(cnt_type, "operations", cnt_type_len); + strlcpy(cnt_type, "operations", cnt_type_len); else if (strncmp(type_end, "_errors", strlen("_errors")) == 0) - strncpy(cnt_type, "errors", cnt_type_len); + strlcpy(cnt_type, "errors", cnt_type_len); else if (strncmp(type_end, "_filters", strlen("_filters")) == 0) - strncpy(cnt_type, "filter_result", cnt_type_len); + strlcpy(cnt_type, "filter_result", cnt_type_len); } else if ((type_end != NULL) && (strncmp(cnt_name, "mac_", strlen("mac_"))) == 0) { if (strncmp(type_end, "_errors", strlen("_errors")) == 0) - strncpy(cnt_type, "errors", cnt_type_len); + strlcpy(cnt_type, "errors", cnt_type_len); } else { /* Does not fit obvious type, or strrchr error: */ /* use a more generic type */ - strncpy(cnt_type, "derive", cnt_type_len); + strlcpy(cnt_type, "derive", cnt_type_len); } } @@ -544,8 +582,16 @@ err: static void nic_xstats_clear(uint16_t port_id) { + int ret; + printf("\n Clearing NIC xstats for port %d\n", port_id); - rte_eth_xstats_reset(port_id); + ret = rte_eth_xstats_reset(port_id); + if (ret != 0) { + printf("\n Error clearing xstats for port %d: %s\n", port_id, + strerror(-ret)); + return; + } + printf("\n NIC extended statistics for port %d cleared\n", port_id); } @@ -634,20 +680,30 @@ show_port(void) printf(" - generic config\n"); printf("\t -- Socket %d\n", rte_eth_dev_socket_id(i)); - rte_eth_link_get(i, &link); - printf("\t -- link speed %d duplex %d," - " auto neg %d status %d\n", - link.link_speed, - link.link_duplex, - link.link_autoneg, - link.link_status); + ret = rte_eth_link_get(i, &link); + if (ret < 0) { + printf("Link get failed (port %u): %s\n", + i, rte_strerror(-ret)); + } else { + printf("\t -- link speed %d duplex %d," + " auto neg %d status %d\n", + link.link_speed, + link.link_duplex, + link.link_autoneg, + link.link_status); + } printf("\t -- promiscuous (%d)\n", rte_eth_promiscuous_get(i)); ret = rte_eth_dev_get_mtu(i, &mtu); if (ret == 0) printf("\t -- mtu (%d)\n", mtu); - rte_eth_dev_info_get(i, &dev_info); + ret = rte_eth_dev_info_get(i, &dev_info); + if (ret != 0) { + printf("Error during getting device (port %u) info: %s\n", + i, strerror(-ret)); + return; + } printf(" - queue\n"); for (j = 0; j < dev_info.nb_rx_queues; j++) { @@ -679,6 +735,7 @@ show_port(void) } printf(" - cyrpto context\n"); +#ifdef RTE_LIBRTE_SECURITY void *p_ctx = rte_eth_dev_get_sec_ctx(i); printf("\t -- security context - %p\n", p_ctx); @@ -697,6 +754,7 @@ show_port(void) s_cap->crypto_capabilities->op); } } +#endif } STATS_BDR_STR(50, ""); @@ -800,7 +858,13 @@ show_tm(void) memset(&cap, 0, sizeof(cap)); memset(&error, 0, sizeof(error)); - rte_eth_dev_info_get(i, &dev_info); + ret = rte_eth_dev_info_get(i, &dev_info); + if (ret != 0) { + printf("Error during getting device (port %u) info: %s\n", + i, strerror(-ret)); + return; + } + printf(" - Generic for port (%u)\n" "\t -- driver name %s\n" "\t -- max vf (%u)\n" @@ -837,21 +901,21 @@ show_tm(void) printf(" - mark support:\n"); printf("\t -- vlan dei: GREEN (%d) YELLOW (%d) RED (%d)\n", - cap.mark_vlan_dei_supported[RTE_TM_GREEN], - cap.mark_vlan_dei_supported[RTE_TM_YELLOW], - cap.mark_vlan_dei_supported[RTE_TM_RED]); + cap.mark_vlan_dei_supported[RTE_COLOR_GREEN], + cap.mark_vlan_dei_supported[RTE_COLOR_YELLOW], + cap.mark_vlan_dei_supported[RTE_COLOR_RED]); printf("\t -- ip ecn tcp: GREEN (%d) YELLOW (%d) RED (%d)\n", - cap.mark_ip_ecn_tcp_supported[RTE_TM_GREEN], - cap.mark_ip_ecn_tcp_supported[RTE_TM_YELLOW], - cap.mark_ip_ecn_tcp_supported[RTE_TM_RED]); + cap.mark_ip_ecn_tcp_supported[RTE_COLOR_GREEN], + cap.mark_ip_ecn_tcp_supported[RTE_COLOR_YELLOW], + cap.mark_ip_ecn_tcp_supported[RTE_COLOR_RED]); printf("\t -- ip ecn sctp: GREEN (%d) YELLOW (%d) RED (%d)\n", - cap.mark_ip_ecn_sctp_supported[RTE_TM_GREEN], - cap.mark_ip_ecn_sctp_supported[RTE_TM_YELLOW], - cap.mark_ip_ecn_sctp_supported[RTE_TM_RED]); + cap.mark_ip_ecn_sctp_supported[RTE_COLOR_GREEN], + cap.mark_ip_ecn_sctp_supported[RTE_COLOR_YELLOW], + cap.mark_ip_ecn_sctp_supported[RTE_COLOR_RED]); printf("\t -- ip dscp: GREEN (%d) YELLOW (%d) RED (%d)\n", - cap.mark_ip_dscp_supported[RTE_TM_GREEN], - cap.mark_ip_dscp_supported[RTE_TM_YELLOW], - cap.mark_ip_dscp_supported[RTE_TM_RED]); + cap.mark_ip_dscp_supported[RTE_COLOR_GREEN], + cap.mark_ip_dscp_supported[RTE_COLOR_YELLOW], + cap.mark_ip_dscp_supported[RTE_COLOR_RED]); printf(" - mask stats (0x%"PRIx64")" " dynamic update (0x%"PRIx64")\n", @@ -968,12 +1032,219 @@ show_tm(void) " pkts (%"PRIu64") bytes (%"PRIu64")\n" "\t -- RED:" " pkts (%"PRIu64") bytes (%"PRIu64")\n", - stats.leaf.n_pkts_dropped[RTE_TM_GREEN], - stats.leaf.n_bytes_dropped[RTE_TM_GREEN], - stats.leaf.n_pkts_dropped[RTE_TM_YELLOW], - stats.leaf.n_bytes_dropped[RTE_TM_YELLOW], - stats.leaf.n_pkts_dropped[RTE_TM_RED], - stats.leaf.n_bytes_dropped[RTE_TM_RED]); + stats.leaf.n_pkts_dropped[RTE_COLOR_GREEN], + stats.leaf.n_bytes_dropped[RTE_COLOR_GREEN], + stats.leaf.n_pkts_dropped[RTE_COLOR_YELLOW], + stats.leaf.n_bytes_dropped[RTE_COLOR_YELLOW], + stats.leaf.n_pkts_dropped[RTE_COLOR_RED], + stats.leaf.n_bytes_dropped[RTE_COLOR_RED]); + } + } + + STATS_BDR_STR(50, ""); +} + +static void +display_crypto_feature_info(uint64_t x) +{ + if (x == 0) + return; + + printf("\t -- feature flags\n"); + printf("\t\t + symmetric (%c), asymmetric (%c)\n" + "\t\t + symmetric operation chaining (%c)\n", + (x & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ? 'y' : 'n', + (x & RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO) ? 'y' : 'n', + (x & RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING) ? 'y' : 'n'); + printf("\t\t + CPU: SSE (%c), AVX (%c), AVX2 (%c), AVX512 (%c)\n", + (x & RTE_CRYPTODEV_FF_CPU_SSE) ? 'y' : 'n', + (x & RTE_CRYPTODEV_FF_CPU_AVX) ? 'y' : 'n', + (x & RTE_CRYPTODEV_FF_CPU_AVX2) ? 'y' : 'n', + (x & RTE_CRYPTODEV_FF_CPU_AVX512) ? 'y' : 'n'); + printf("\t\t + AESNI: CPU (%c), HW (%c)\n", + (x & RTE_CRYPTODEV_FF_CPU_AESNI) ? 'y' : 'n', + (x & RTE_CRYPTODEV_FF_HW_ACCELERATED) ? 'y' : 'n'); + printf("\t\t + INLINE (%c)\n", + (x & RTE_CRYPTODEV_FF_SECURITY) ? 'y' : 'n'); + printf("\t\t + ARM: NEON (%c), CE (%c)\n", + (x & RTE_CRYPTODEV_FF_CPU_NEON) ? 'y' : 'n', + (x & RTE_CRYPTODEV_FF_CPU_ARM_CE) ? 'y' : 'n'); + printf("\t -- buffer offload\n"); + printf("\t\t + IN_PLACE_SGL (%c)\n", + (x & RTE_CRYPTODEV_FF_IN_PLACE_SGL) ? 'y' : 'n'); + printf("\t\t + OOP_SGL_IN_SGL_OUT (%c)\n", + (x & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT) ? 'y' : 'n'); + printf("\t\t + OOP_SGL_IN_LB_OUT (%c)\n", + (x & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT) ? 'y' : 'n'); + printf("\t\t + OOP_LB_IN_SGL_OUT (%c)\n", + (x & RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT) ? 'y' : 'n'); + printf("\t\t + OOP_LB_IN_LB_OUT (%c)\n", + (x & RTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT) ? 'y' : 'n'); +} + +static void +show_crypto(void) +{ + uint8_t crypto_dev_count = rte_cryptodev_count(), i; + + snprintf(bdr_str, MAX_STRING_LEN, " show - CRYPTO PMD %"PRIu64, + rte_get_tsc_hz()); + STATS_BDR_STR(10, bdr_str); + + for (i = 0; i < crypto_dev_count; i++) { + struct rte_cryptodev_info dev_info; + struct rte_cryptodev_stats stats; + + rte_cryptodev_info_get(i, &dev_info); + + printf(" - device (%u)\n", i); + printf("\t -- name (%s)\n" + "\t -- driver (%s)\n" + "\t -- id (%u) on socket (%d)\n" + "\t -- queue pairs (%d)\n", + rte_cryptodev_name_get(i), + dev_info.driver_name, + dev_info.driver_id, + dev_info.device->numa_node, + rte_cryptodev_queue_pair_count(i)); + + display_crypto_feature_info(dev_info.feature_flags); + + memset(&stats, 0, sizeof(0)); + if (rte_cryptodev_stats_get(i, &stats) == 0) { + printf("\t -- stats\n"); + printf("\t\t + enqueue count (%"PRIu64")" + " error (%"PRIu64")\n", + stats.enqueued_count, + stats.enqueue_err_count); + printf("\t\t + dequeue count (%"PRIu64")" + " error (%"PRIu64")\n", + stats.dequeued_count, + stats.dequeue_err_count); + } + } + + STATS_BDR_STR(50, ""); +} + +static void +show_ring(char *name) +{ + snprintf(bdr_str, MAX_STRING_LEN, " show - RING %"PRIu64, + rte_get_tsc_hz()); + STATS_BDR_STR(10, bdr_str); + + if (name != NULL) { + struct rte_ring *ptr = rte_ring_lookup(name); + if (ptr != NULL) { + printf(" - Name (%s) on socket (%d)\n" + " - flags:\n" + "\t -- Single Producer Enqueue (%u)\n" + "\t -- Single Consmer Dequeue (%u)\n", + ptr->name, + ptr->memzone->socket_id, + ptr->flags & RING_F_SP_ENQ, + ptr->flags & RING_F_SC_DEQ); + printf(" - size (%u) mask (0x%x) capacity (%u)\n", + ptr->size, + ptr->mask, + ptr->capacity); + printf(" - count (%u) free count (%u)\n", + rte_ring_count(ptr), + rte_ring_free_count(ptr)); + printf(" - full (%d) empty (%d)\n", + rte_ring_full(ptr), + rte_ring_empty(ptr)); + + STATS_BDR_STR(50, ""); + return; + } + } + + rte_ring_list_dump(stdout); + STATS_BDR_STR(50, ""); +} + +static void +show_mempool(char *name) +{ + uint64_t flags = 0; + + snprintf(bdr_str, MAX_STRING_LEN, " show - MEMPOOL %"PRIu64, + rte_get_tsc_hz()); + STATS_BDR_STR(10, bdr_str); + + if (name != NULL) { + struct rte_mempool *ptr = rte_mempool_lookup(name); + if (ptr != NULL) { + flags = ptr->flags; + printf(" - Name: %s on socket %d\n" + " - flags:\n" + "\t -- No spread (%c)\n" + "\t -- No cache align (%c)\n" + "\t -- SP put (%c), SC get (%c)\n" + "\t -- Pool created (%c)\n" + "\t -- No IOVA config (%c)\n", + ptr->name, + ptr->socket_id, + (flags & MEMPOOL_F_NO_SPREAD) ? 'y' : 'n', + (flags & MEMPOOL_F_NO_CACHE_ALIGN) ? 'y' : 'n', + (flags & MEMPOOL_F_SP_PUT) ? 'y' : 'n', + (flags & MEMPOOL_F_SC_GET) ? 'y' : 'n', + (flags & MEMPOOL_F_POOL_CREATED) ? 'y' : 'n', + (flags & MEMPOOL_F_NO_IOVA_CONTIG) ? 'y' : 'n'); + printf(" - Size %u Cache %u element %u\n" + " - header %u trailer %u\n" + " - private data size %u\n", + ptr->size, + ptr->cache_size, + ptr->elt_size, + ptr->header_size, + ptr->trailer_size, + ptr->private_data_size); + printf(" - memezone - socket %d\n", + ptr->mz->socket_id); + printf(" - Count: avail (%u), in use (%u)\n", + rte_mempool_avail_count(ptr), + rte_mempool_in_use_count(ptr)); + + STATS_BDR_STR(50, ""); + return; + } + } + + rte_mempool_list_dump(stdout); + STATS_BDR_STR(50, ""); +} + +static void +mempool_itr_obj(struct rte_mempool *mp, void *opaque, + void *obj, unsigned int obj_idx) +{ + printf(" - obj_idx %u opaque %p obj %p\n", + obj_idx, opaque, obj); + + if (obj) + rte_hexdump(stdout, " Obj Content", + obj, (mp->elt_size > 256)?256:mp->elt_size); +} + +static void +iter_mempool(char *name) +{ + snprintf(bdr_str, MAX_STRING_LEN, " iter - MEMPOOL %"PRIu64, + rte_get_tsc_hz()); + STATS_BDR_STR(10, bdr_str); + + if (name != NULL) { + struct rte_mempool *ptr = rte_mempool_lookup(name); + if (ptr != NULL) { + /* iterate each object */ + uint32_t ret = rte_mempool_obj_iter(ptr, + mempool_itr_obj, NULL); + printf("\n - iterated %u objects\n", ret); + STATS_BDR_STR(50, ""); + return; } } @@ -1065,12 +1336,20 @@ main(int argc, char **argv) show_port(); if (enable_shw_tm) show_tm(); + if (enable_shw_crypto) + show_crypto(); + if (enable_shw_ring) + show_ring(ring_name); + if (enable_shw_mempool) + show_mempool(mempool_name); + if (enable_iter_mempool) + iter_mempool(mempool_iter_name); ret = rte_eal_cleanup(); if (ret) printf("Error from rte_eal_cleanup(), %d\n", ret); - snprintf(bdr_str, MAX_STRING_LEN, " "); + strlcpy(bdr_str, " ", MAX_STRING_LEN); STATS_BDR_STR(50, bdr_str); return 0;