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

David Marchand david.marchand at redhat.com
Tue Jun 25 10:58:01 CEST 2019


On Tue, Jun 25, 2019 at 10:53 AM Pei, Andy <andy.pei at intel.com> wrote:

> Hi, Marchand,
>

You can call me David :-).


>
> 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> wrote:
>
> *From:* David Marchand [mailto:david.marchand at redhat.com]
> *Sent:* Wednesday, June 19, 2019 5:06 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 Wed, Jun 19, 2019 at 10:56 AM Andy Pei <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
>
> Signed-off-by: Andy Pei <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?
>

Yes this is ok.

I just wanted to make clear that we have a gap in OVS.
ipn3ke is not the only hw/driver.

We will probably need to do something either on dpdk or on ovs side at some
point.


-- 
David Marchand

>


More information about the dev mailing list