From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 0AB842C4B for ; Fri, 6 May 2016 13:11:17 +0200 (CEST) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP; 06 May 2016 04:11:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,586,1455004800"; d="scan'208";a="973967420" Received: from rhorton-mobl.ger.corp.intel.com (HELO VM.ir.intel.com) ([163.33.228.56]) by fmsmga002.fm.intel.com with ESMTP; 06 May 2016 04:11:17 -0700 From: Remy Horton To: dev@dpdk.org Date: Fri, 6 May 2016 12:11:12 +0100 Message-Id: <1462533074-1994-2-git-send-email-remy.horton@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1462533074-1994-1-git-send-email-remy.horton@intel.com> References: <1462533074-1994-1-git-send-email-remy.horton@intel.com> Subject: [dpdk-dev] [RFC PATCH v2 1/3] rte: change xstats to use integer keys X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 May 2016 11:11:18 -0000 Signed-off-by: Remy Horton --- lib/librte_ether/rte_ethdev.c | 100 ++++++++++++++++++++++++++++++++++++------ lib/librte_ether/rte_ethdev.h | 55 +++++++++++++++++++++++ 2 files changed, 142 insertions(+), 13 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index a31018e..29ba12c 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -112,7 +112,6 @@ static const struct rte_eth_xstats_name_off rte_txq_stats_strings[] = { #define RTE_NB_TXQ_STATS (sizeof(rte_txq_stats_strings) / \ sizeof(rte_txq_stats_strings[0])) - /** * The user application callback description. * @@ -1507,6 +1506,87 @@ rte_eth_stats_reset(uint8_t port_id) dev->data->rx_mbuf_alloc_failed = 0; } +int +rte_eth_xstats_count(uint8_t port_id) +{ + struct rte_eth_dev *dev; + int count; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL); + dev = &rte_eth_devices[port_id]; + if (dev->dev_ops->xstats_names != NULL) { + count = (*dev->dev_ops->xstats_names)(dev, NULL, 0); + if (count < 0) + return count; + } else + count = 0; + count += RTE_NB_STATS; + count += dev->data->nb_rx_queues * RTE_NB_RXQ_STATS; + count += dev->data->nb_tx_queues * RTE_NB_TXQ_STATS; + return count; +} + +int +rte_eth_xstats_names(uint8_t port_id, struct rte_eth_xstats_name *ptr_names, + unsigned limit) +{ + struct rte_eth_dev *dev; + int cnt_used_entries; + int cnt_expected_entries; + uint32_t idx, id_queue; + + if (ptr_names == NULL) + return -EINVAL; + cnt_expected_entries = rte_eth_xstats_count(port_id); + if (cnt_expected_entries < 0) + return cnt_expected_entries; + if ((int)limit < cnt_expected_entries) + return -ERANGE; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL); + dev = &rte_eth_devices[port_id]; + if (dev->dev_ops->xstats_names != NULL) { + cnt_used_entries = (*dev->dev_ops->xstats_names)( + dev, ptr_names, limit); + if (cnt_used_entries < 0) + return cnt_used_entries; + } else + /* Driver itself does not support extended stats, but + * still have basic stats. + */ + cnt_used_entries = 0; + + for (idx = 0; idx < RTE_NB_STATS; idx++) { + ptr_names[cnt_used_entries].id = cnt_used_entries; + snprintf(ptr_names[cnt_used_entries].name, + sizeof(ptr_names[0].name), + "%s", rte_stats_strings[idx].name); + cnt_used_entries++; + } + for (id_queue = 0; id_queue < dev->data->nb_rx_queues; id_queue++) { + for (idx = 0; idx < RTE_NB_RXQ_STATS; idx++) { + ptr_names[cnt_used_entries].id = cnt_used_entries; + snprintf(ptr_names[cnt_used_entries].name, + sizeof(ptr_names[0].name), + "rx_q%u%s", + id_queue, rte_rxq_stats_strings[idx].name); + cnt_used_entries++; + } + + } + for (id_queue = 0; id_queue < dev->data->nb_tx_queues; id_queue++) { + for (idx = 0; idx < RTE_NB_TXQ_STATS; idx++) { + ptr_names[cnt_used_entries].id = cnt_used_entries; + snprintf(ptr_names[cnt_used_entries].name, + sizeof(ptr_names[0].name), + "tx_q%u%s", + id_queue, rte_txq_stats_strings[idx].name); + cnt_used_entries++; + } + } + return cnt_used_entries; +} + /* retrieve ethdev extended statistics */ int rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstats *xstats, @@ -1551,8 +1631,8 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstats *xstats, stats_ptr = RTE_PTR_ADD(ð_stats, rte_stats_strings[i].offset); val = *stats_ptr; - snprintf(xstats[count].name, sizeof(xstats[count].name), - "%s", rte_stats_strings[i].name); + xstats[count].name[0] = '\0'; + xstats[count].id = count + xcount; xstats[count++].value = val; } @@ -1563,9 +1643,8 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstats *xstats, rte_rxq_stats_strings[i].offset + q * sizeof(uint64_t)); val = *stats_ptr; - snprintf(xstats[count].name, sizeof(xstats[count].name), - "rx_q%u_%s", q, - rte_rxq_stats_strings[i].name); + xstats[count].name[0] = '\0'; + xstats[count].id = count + xcount; xstats[count++].value = val; } } @@ -1577,9 +1656,8 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstats *xstats, rte_txq_stats_strings[i].offset + q * sizeof(uint64_t)); val = *stats_ptr; - snprintf(xstats[count].name, sizeof(xstats[count].name), - "tx_q%u_%s", q, - rte_txq_stats_strings[i].name); + xstats[count].name[0] = '\0'; + xstats[count].id = count + xcount; xstats[count++].value = val; } } @@ -1621,7 +1699,6 @@ set_queue_stats_mapping(uint8_t port_id, uint16_t queue_id, uint8_t stat_idx, (dev, queue_id, stat_idx, is_rx); } - int rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id, uint16_t tx_queue_id, uint8_t stat_idx) @@ -1630,7 +1707,6 @@ rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id, uint16_t tx_queue_id, STAT_QMAP_TX); } - int rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id, uint8_t stat_idx) @@ -1639,7 +1715,6 @@ rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id, STAT_QMAP_RX); } - void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info) { @@ -1699,7 +1774,6 @@ rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr) ether_addr_copy(&dev->data->mac_addrs[0], mac_addr); } - int rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu) { diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 022733e..eaeb703 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -941,10 +941,23 @@ struct rte_eth_txq_info { * structure. */ struct rte_eth_xstats { + /* FIXME: Remove name[] once remaining drivers converted */ char name[RTE_ETH_XSTATS_NAME_SIZE]; + uint64_t id; uint64_t value; }; +/** + * A name-key lookup element for extended statistics. + * + * This structure is used to map between names and ID numbers + * for extended ethernet statistics. + */ +struct rte_eth_xstats_name { + char name[RTE_ETH_XSTATS_NAME_SIZE]; + uint64_t id; +}; + #define ETH_DCB_NUM_TCS 8 #define ETH_MAX_VMDQ_POOL 64 @@ -1080,6 +1093,13 @@ typedef int (*eth_xstats_get_t)(struct rte_eth_dev *dev, typedef void (*eth_xstats_reset_t)(struct rte_eth_dev *dev); /**< @internal Reset extended stats of an Ethernet device. */ +typedef int (*eth_xstats_names_t)(struct rte_eth_dev *dev, + struct rte_eth_xstats_name *ptr_names, unsigned limit); +/**< @internal Get names of extended stats of an Ethernet device. */ + +typedef int (*eth_xstats_count_t)(struct rte_eth_dev *dev); +/**< @internal Get count of extended stats of an Ethernet device. */ + typedef int (*eth_queue_stats_mapping_set_t)(struct rte_eth_dev *dev, uint16_t queue_id, uint8_t stat_idx, @@ -1427,6 +1447,10 @@ struct eth_dev_ops { eth_stats_reset_t stats_reset; /**< Reset generic device statistics. */ eth_xstats_get_t xstats_get; /**< Get extended device statistics. */ eth_xstats_reset_t xstats_reset; /**< Reset extended device statistics. */ + eth_xstats_names_t xstats_names; + /**< Get names of extended statistics. */ + eth_xstats_count_t xstats_count; + /**< Get number of extended statistics. */ eth_queue_stats_mapping_set_t queue_stats_mapping_set; /**< Configure per queue stat counter mapping. */ eth_dev_infos_get_t dev_infos_get; /**< Get device info. */ @@ -2279,6 +2303,37 @@ int rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats); void rte_eth_stats_reset(uint8_t port_id); /** + * Retrieve names of extended statistics of an Ethernet device. + * + * Names within ptr_strings will be aligned to RTE_ETH_XSTATS_NAME_SIZE and + * will be listed in ascending mapping order. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param ptr_names + * Block of memory to insert names into. Must be at least limit in size. + * @param limit + * Capacity of ptr_strings (number of names). + * @return + * If successful, number of statistics; negative on error. + */ +int rte_eth_xstats_names(uint8_t port_id, struct rte_eth_xstats_name *ptr_names, + unsigned limit); + +/** + * Retrieve number of extended statistics of an Ethernet device. + * + * Names within ptr_strings will be aligned to RTE_ETH_XSTATS_NAME_SIZE and + * will be listed in ascending mapping order. + * + * @param port_id + * The port identifier of the Ethernet device. + * @return + * If successful, number of statistics; negative on error. + */ +int rte_eth_xstats_count(uint8_t port_id); + +/** * Retrieve extended statistics of an Ethernet device. * * @param port_id -- 2.5.5