[dpdk-dev] [PATCH v3 4/4] net/ipn3ke: implementation of statistics

Pei, Andy andy.pei at intel.com
Tue Jun 25 10:53:30 CEST 2019


Hi, Marchand,

Reply in line.

From: David Marchand [mailto:david.marchand at redhat.com]
Sent: Tuesday, June 25, 2019 3:17 PM
To: Pei, Andy <andy.pei at intel.com>
Cc: dev <dev at dpdk.org>; Xu, Rosen <rosen.xu at intel.com>
Subject: Re: [dpdk-dev] [PATCH v3 4/4] net/ipn3ke: implementation of statistics



On Tue, Jun 25, 2019 at 9:10 AM Pei, Andy <andy.pei at intel.com<mailto:andy.pei at intel.com>> wrote:
From: David Marchand [mailto:david.marchand at redhat.com<mailto:david.marchand at redhat.com>]
Sent: Wednesday, June 19, 2019 5:06 PM
To: Pei, Andy <andy.pei at intel.com<mailto:andy.pei at intel.com>>
Cc: dev <dev at dpdk.org<mailto:dev at dpdk.org>>; Xu, Rosen <rosen.xu at intel.com<mailto:rosen.xu at intel.com>>
Subject: Re: [dpdk-dev] [PATCH v3 4/4] net/ipn3ke: implementation of statistics



On Wed, Jun 19, 2019 at 10:56 AM Andy Pei <andy.pei at intel.com<mailto:andy.pei at intel.com>> wrote:
This patch implemente statistics read and reset
function for ipn3ke.

Fixes: 70d6b7f550f4 ("net/ipn3ke: add representor")
Cc: rosen.xu at intel.com<mailto:rosen.xu at intel.com>

Signed-off-by: Andy Pei <andy.pei at intel.com<mailto:andy.pei at intel.com>>
---
 drivers/net/ipn3ke/ipn3ke_representor.c | 3440 ++++++++++++++++++++++++++++++-
 1 file changed, 3431 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ipn3ke/ipn3ke_representor.c b/drivers/net/ipn3ke/ipn3ke_representor.c
index b166b8f..ed82ee7 100644
--- a/drivers/net/ipn3ke/ipn3ke_representor.c
+++ b/drivers/net/ipn3ke/ipn3ke_representor.c
@@ -3,6 +3,7 @@
  */

 #include <stdint.h>
+#include <unistd.h>

 #include <rte_bus_pci.h>
 #include <rte_ethdev.h>
@@ -297,31 +298,3452 @@
 {
 }

+/* Statistics collected by each port, VSI, VEB, and S-channel */
+struct ipn3ke_rpst_eth_stats {
+       uint64_t tx_bytes;               /* gotc */
+       uint64_t tx_multicast;           /* mptc */
+       uint64_t tx_broadcast;           /* bptc */
+       uint64_t tx_unicast;             /* uptc */
+       uint64_t tx_discards;            /* tdpc */
+       uint64_t tx_errors;              /* tepc */
+       uint64_t rx_bytes;               /* gorc */
+       uint64_t rx_multicast;           /* mprc */
+       uint64_t rx_broadcast;           /* bprc */
+       uint64_t rx_unicast;             /* uprc */
+       uint64_t rx_discards;            /* rdpc */
+       uint64_t rx_unknown_protocol;    /* rupp */
+};
+
+/* store statistics names and its offset in stats structure */
+struct ipn3ke_rpst_xstats_name_offset {
+       char name[RTE_ETH_XSTATS_NAME_SIZE];
+       unsigned int offset;
+};
+
+static const struct ipn3ke_rpst_xstats_name_offset
+ipn3ke_rpst_stats_strings[] = {
+       {"tx_multicast_packets",          offsetof(struct ipn3ke_rpst_eth_stats,
+                                                       tx_multicast)},
+       {"tx_broadcast_packets",          offsetof(struct ipn3ke_rpst_eth_stats,
+                                                       tx_broadcast)},
+       {"tx_unicast_packets",            offsetof(struct ipn3ke_rpst_eth_stats,
+                                                       tx_unicast)},
+       {"tx_dropped",                    offsetof(struct ipn3ke_rpst_eth_stats,
+                                                       tx_discards)},
+       {"rx_multicast_packets",          offsetof(struct ipn3ke_rpst_eth_stats,
+                                                       rx_multicast)},
+       {"rx_broadcast_packets",          offsetof(struct ipn3ke_rpst_eth_stats,
+                                                       rx_broadcast)},
+       {"rx_unicast_packets",            offsetof(struct ipn3ke_rpst_eth_stats,
+                                                       rx_unicast)},
+       {"rx_dropped",                    offsetof(struct ipn3ke_rpst_eth_stats,
+                                                       rx_discards)},
+       {"rx_unknown_protocol_packets", offsetof(struct ipn3ke_rpst_eth_stats,
+                                                       rx_unknown_protocol)},

Please see recent fixes on i40e and ice.
tx_dropped -> tx_dropped_packets
rx_dropped -> rx_dropped_packets

https://git.dpdk.org/next/dpdk-next-net-intel/commit/?id=e61e25233e9dfcd5386d83ab988790d9d5bd9400


>>>> Do  this in v4.

+};
+
+#define IPN3KE_RPST_ETH_XSTATS_CNT (sizeof(ipn3ke_rpst_stats_strings) / \
+               sizeof(ipn3ke_rpst_stats_strings[0]))
+
+#define IPN3KE_RPST_PRIO_XSTATS_CNT    8
+
+/* Statistics collected by the MAC */
+struct ipn3ke_rpst_hw_port_stats {
+       /* eth stats collected by the port */
+       struct ipn3ke_rpst_eth_stats eth;
+
+       /* additional port specific stats */
+       uint64_t tx_dropped_link_down;
+       uint64_t crc_errors;
+       uint64_t illegal_bytes;
+       uint64_t error_bytes;
+       uint64_t mac_local_faults;
+       uint64_t mac_remote_faults;
+       uint64_t rx_length_errors;
+       uint64_t link_xon_rx;
+       uint64_t link_xoff_rx;
+       uint64_t priority_xon_rx[IPN3KE_RPST_PRIO_XSTATS_CNT];
+       uint64_t priority_xoff_rx[IPN3KE_RPST_PRIO_XSTATS_CNT];
+       uint64_t link_xon_tx;
+       uint64_t link_xoff_tx;
+       uint64_t priority_xon_tx[IPN3KE_RPST_PRIO_XSTATS_CNT];
+       uint64_t priority_xoff_tx[IPN3KE_RPST_PRIO_XSTATS_CNT];
+       uint64_t priority_xon_2_xoff[IPN3KE_RPST_PRIO_XSTATS_CNT];
+       uint64_t rx_size_64;
+       uint64_t rx_size_65_127;
+       uint64_t rx_size_128_255;
+       uint64_t rx_size_256_511;
+       uint64_t rx_size_512_1023;
+       uint64_t rx_size_1024_1518;
+       uint64_t rx_size_big;
+       uint64_t rx_undersize;
+       uint64_t rx_fragments;
+       uint64_t rx_oversize;
+       uint64_t rx_jabber;
+       uint64_t tx_size_64;
+       uint64_t tx_size_65_127;
+       uint64_t tx_size_128_255;
+       uint64_t tx_size_256_511;
+       uint64_t tx_size_512_1023;
+       uint64_t tx_size_1024_1518;
+       uint64_t tx_size_1519_to_max;
+       uint64_t mac_short_packet_dropped;
+       uint64_t checksum_error;
+       /* flow director stats */
+       uint64_t fd_atr_match;
+       uint64_t fd_sb_match;
+       uint64_t fd_atr_tunnel_match;
+       uint32_t fd_atr_status;
+       uint32_t fd_sb_status;
+       /* EEE LPI */
+       uint32_t tx_lpi_status;
+       uint32_t rx_lpi_status;
+       uint64_t tx_lpi_count;
+       uint64_t rx_lpi_count;
+};
+
+static const struct ipn3ke_rpst_xstats_name_offset
+ipn3ke_rpst_hw_port_strings[] = {
+       {"tx_link_down_dropped",      offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                               tx_dropped_link_down)},
+       {"rx_crc_errors",             offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                               crc_errors)},
+       {"rx_illegal_byte_errors",    offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                               illegal_bytes)},
+       {"rx_error_bytes",            offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                               error_bytes)},
+       {"mac_local_errors",          offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                               mac_local_faults)},
+       {"mac_remote_errors",         offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                               mac_remote_faults)},
+       {"rx_length_errors",          offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                               rx_length_errors)},
+       {"tx_xon_packets",            offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                               link_xon_tx)},
+       {"rx_xon_packets",            offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                               link_xon_rx)},
+       {"tx_xoff_packets",           offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                               link_xoff_tx)},
+       {"rx_xoff_packets",           offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                               link_xoff_rx)},
+       {"rx_size_64_packets",        offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                               rx_size_64)},
+       {"rx_size_65_to_127_packets", offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                               rx_size_65_127)},
+       {"rx_size_128_to_255_packets",
+                               offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                        rx_size_128_255)},
+       {"rx_size_256_to_511_packets",
+                               offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                        rx_size_256_511)},
+       {"rx_size_512_to_1023_packets",
+                               offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                        rx_size_512_1023)},
+       {"rx_size_1024_to_1518_packets",
+                               offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                        rx_size_1024_1518)},
+       {"rx_size_1519_to_max_packets",
+                               offsetof(struct ipn3ke_rpst_hw_port_stats,
+                                        rx_size_big)},

Just a note, but those stats won't work with the current way ovs looks at per size counters.

>>>> Just keep this in the same way with I40E currently.


Look at the i40e stats:
        {"rx_size_1523_to_max_packets", offsetof(struct i40e_hw_port_stats,
                rx_size_big)},

Then look at ovs mapping on top of this:
#define XSTAT_RX_1523_TO_MAX_PACKETS     "rx_size_1523_to_max_packets"
        } else if (strcmp(XSTAT_RX_1523_TO_MAX_PACKETS, names[i].name) == 0) {
            stats->rx_1523_to_max_packets = xstats[i].value;

Here, your stats name is "rx_size_1519_to_max_packets", ovs won't catch those stats for ipn3ke.


Maybe you don't want to support ovs with this nic and/or the hw behaves this way and you can do nothing about it.
But don't reply "same as i40e".

Sorry, it seems I misunderstand your point.
For ipn3ke, currently, the hardware does not support statistics for packets with the length between 1024 and 1523, and packets with length over 1523.
Ipn3ke hardware now supports statistics for packets with the length between 1024 and 1518, and packets with length over 1519.
"same as i40e" here means that is it OK to leave this stats name the same pattern with i40e?


--
David Marchand


More information about the dev mailing list