From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id B95065A96 for ; Tue, 9 Jun 2015 17:10:55 +0200 (CEST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 09 Jun 2015 08:10:57 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,581,1427785200"; d="scan'208";a="743677411" Received: from sie-lab-212-170.ir.intel.com (HELO silpixa00378251.ir.intel.com) ([10.237.212.170]) by orsmga002.jf.intel.com with ESMTP; 09 Jun 2015 08:10:56 -0700 From: Maryam Tahhan To: dev@dpdk.org Date: Tue, 9 Jun 2015 16:10:42 +0100 Message-Id: <1433862646-91880-4-git-send-email-maryam.tahhan@intel.com> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1433862646-91880-1-git-send-email-maryam.tahhan@intel.com> References: <1433862646-91880-1-git-send-email-maryam.tahhan@intel.com> Subject: [dpdk-dev] [PATCH v2 3/7] ixgbe: Expose extended error statistics 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: Tue, 09 Jun 2015 15:10:56 -0000 Implement xstats_get() and xstats_reset() in dev_ops for ixgbe to expose detailed error statistics to DPDK applications. Signed-off-by: Maryam Tahhan --- drivers/net/ixgbe/ixgbe_ethdev.c | 85 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index 543e8ab..609bd30 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -131,7 +131,10 @@ static int ixgbe_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete); static void ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); +static int ixgbe_dev_xstats_get(struct rte_eth_dev *dev, + struct rte_eth_xstats *xstats, unsigned n); static void ixgbe_dev_stats_reset(struct rte_eth_dev *dev); +static void ixgbe_dev_xstats_reset(struct rte_eth_dev *dev); static int ixgbe_dev_queue_stats_mapping_set(struct rte_eth_dev *eth_dev, uint16_t queue_id, uint8_t stat_idx, @@ -330,7 +333,9 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = { .allmulticast_disable = ixgbe_dev_allmulticast_disable, .link_update = ixgbe_dev_link_update, .stats_get = ixgbe_dev_stats_get, + .xstats_get = ixgbe_dev_xstats_get, .stats_reset = ixgbe_dev_stats_reset, + .xstats_reset = ixgbe_dev_xstats_reset, .queue_stats_mapping_set = ixgbe_dev_queue_stats_mapping_set, .dev_infos_get = ixgbe_dev_info_get, .mtu_set = ixgbe_dev_mtu_set, @@ -408,6 +413,33 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = { .mac_addr_remove = ixgbevf_remove_mac_addr, }; +/* store statistics names and its offset in stats structure */ +struct rte_ixgbe_xstats_name_off { + char name[RTE_ETH_XSTATS_NAME_SIZE]; + unsigned offset; +}; + +static const struct rte_ixgbe_xstats_name_off rte_ixgbe_stats_strings[] = { + {"rx_illegal_byte_err", offsetof(struct ixgbe_hw_stats, errbc)}, + {"rx_len_err", offsetof(struct ixgbe_hw_stats, rlec)}, + {"rx_undersize_count", offsetof(struct ixgbe_hw_stats, ruc)}, + {"rx_oversize_count", offsetof(struct ixgbe_hw_stats, roc)}, + {"rx_fragment_count", offsetof(struct ixgbe_hw_stats, rfc)}, + {"rx_jabber_count", offsetof(struct ixgbe_hw_stats, rjc)}, + {"l3_l4_xsum_error", offsetof(struct ixgbe_hw_stats, xec)}, + {"mac_local_fault", offsetof(struct ixgbe_hw_stats, mlfc)}, + {"mac_remote_fault", offsetof(struct ixgbe_hw_stats, mrfc)}, + {"mac_short_pkt_discard", offsetof(struct ixgbe_hw_stats, mspdc)}, + {"fccrc_error", offsetof(struct ixgbe_hw_stats, fccrc)}, + {"fcoe_drop", offsetof(struct ixgbe_hw_stats, fcoerpdc)}, + {"fc_last_error", offsetof(struct ixgbe_hw_stats, fclast)}, + {"rx_broadcast_packets", offsetof(struct ixgbe_hw_stats, bprc)}, + {"mgmt_pkts_dropped", offsetof(struct ixgbe_hw_stats, mngpdc)}, +}; + +#define RTE_NB_XSTATS (sizeof(rte_ixgbe_stats_strings) / \ + sizeof(rte_ixgbe_stats_strings[0])) + /** * Atomically reads the link status information from global * structure rte_eth_dev. @@ -1968,6 +2000,59 @@ ixgbe_dev_stats_reset(struct rte_eth_dev *dev) memset(stats, 0, sizeof(*stats)); } +static int +ixgbe_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstats *xstats, + unsigned n) +{ + struct ixgbe_hw *hw = + IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); + struct ixgbe_hw_stats *hw_stats = + IXGBE_DEV_PRIVATE_TO_STATS(dev->data->dev_private); + uint64_t total_missed_rx, total_qbrc, total_qprc, total_qprdc; + uint64_t rxnfgpc, txdgpc; + unsigned i, count = RTE_NB_XSTATS; + + if (n < count) + return count; + + total_missed_rx = 0; + total_qbrc = 0; + total_qprc = 0; + total_qprdc = 0; + rxnfgpc = 0; + txdgpc = 0; + count = 0; + + ixgbe_read_stats_registers(hw, hw_stats, &total_missed_rx, &total_qbrc, + &total_qprc, &rxnfgpc, &txdgpc, &total_qprdc); + + if (!xstats) + return 0; + + /* Error stats */ + for (i = 0; i < RTE_NB_XSTATS; i++) { + snprintf(xstats[count].name, sizeof(xstats[count].name), + "%s", rte_ixgbe_stats_strings[i].name); + xstats[count++].value = *(uint64_t *)(((char *)hw_stats) + + rte_ixgbe_stats_strings[i].offset); + } + + return count; +} + +static void +ixgbe_dev_xstats_reset(struct rte_eth_dev *dev) +{ + struct ixgbe_hw_stats *stats = + IXGBE_DEV_PRIVATE_TO_STATS(dev->data->dev_private); + + /* HW registers are cleared on read */ + ixgbe_dev_xstats_get(dev, NULL, RTE_NB_XSTATS); + + /* Reset software totals */ + memset(stats, 0, sizeof(*stats)); +} + static void ixgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) { -- 1.9.3