> -----Original Message-----
> From: Liu, Mingxia <mingxia....@intel.com>
> Sent: Tuesday, February 7, 2023 6:17 PM
> To: dev@dpdk.org; Zhang, Qi Z <qi.z.zh...@intel.com>; Wu, Jingjing
> <jingjing...@intel.com>; Xing, Beilei <beilei.x...@intel.com>
> Cc: Liu, Mingxia <mingxia....@intel.com>
> Subject: [PATCH v6 1/6] common/idpf: add hw statistics

Suggest to use ./devtools/check-git-log.sh to fix any title warning if possible
Also the main purpose of this patch is to support stats_get /stats_reset API,
the prefix is more reasonable to be "net/idpf" but not "common/idpf.

Please fix other patches if any similar issue. 

> 
> This patch add hardware packets/bytes statistics.
> 
> Signed-off-by: Mingxia Liu <mingxia....@intel.com>
> ---
>  drivers/common/idpf/idpf_common_device.c   | 17 +++++
>  drivers/common/idpf/idpf_common_device.h   |  4 +
>  drivers/common/idpf/idpf_common_virtchnl.c | 27 +++++++
> drivers/common/idpf/idpf_common_virtchnl.h |  3 +
>  drivers/common/idpf/version.map            |  2 +
>  drivers/net/idpf/idpf_ethdev.c             | 86 ++++++++++++++++++++++
>  6 files changed, 139 insertions(+)
> 
> diff --git a/drivers/common/idpf/idpf_common_device.c
> b/drivers/common/idpf/idpf_common_device.c
> index 48b3e3c0dd..5475a3e52c 100644
> --- a/drivers/common/idpf/idpf_common_device.c
> +++ b/drivers/common/idpf/idpf_common_device.c
> @@ -652,4 +652,21 @@ idpf_vport_info_init(struct idpf_vport *vport,
>       return 0;
>  }
> 
> +void
> +idpf_vport_stats_update(struct virtchnl2_vport_stats *oes, struct
> +virtchnl2_vport_stats *nes) {
> +     nes->rx_bytes = nes->rx_bytes - oes->rx_bytes;
> +     nes->rx_unicast = nes->rx_unicast - oes->rx_unicast;
> +     nes->rx_multicast = nes->rx_multicast - oes->rx_multicast;
> +     nes->rx_broadcast = nes->rx_broadcast - oes->rx_broadcast;
> +     nes->rx_errors = nes->rx_errors - oes->rx_errors;
> +     nes->rx_discards = nes->rx_discards - oes->rx_discards;
> +     nes->tx_bytes = nes->tx_bytes - oes->tx_bytes;
> +     nes->tx_unicast = nes->tx_unicast - oes->tx_unicast;
> +     nes->tx_multicast = nes->tx_multicast - oes->tx_multicast;
> +     nes->tx_broadcast = nes->tx_broadcast - oes->tx_broadcast;
> +     nes->tx_errors = nes->tx_errors - oes->tx_errors;
> +     nes->tx_discards = nes->tx_discards - oes->tx_discards; }
> +
>  RTE_LOG_REGISTER_SUFFIX(idpf_common_logtype, common, NOTICE); diff
> --git a/drivers/common/idpf/idpf_common_device.h
> b/drivers/common/idpf/idpf_common_device.h
> index 545117df79..1d8e7d405a 100644
> --- a/drivers/common/idpf/idpf_common_device.h
> +++ b/drivers/common/idpf/idpf_common_device.h
> @@ -115,6 +115,8 @@ struct idpf_vport {
>       bool tx_vec_allowed;
>       bool rx_use_avx512;
>       bool tx_use_avx512;
> +
> +     struct virtchnl2_vport_stats eth_stats_offset;
>  };
> 
>  /* Message type read in virtual channel from PF */ @@ -191,5 +193,7 @@
> int idpf_vport_irq_unmap_config(struct idpf_vport *vport, uint16_t
> nb_rx_queues)  __rte_internal  int idpf_vport_info_init(struct idpf_vport
> *vport,
>                        struct virtchnl2_create_vport *vport_info);
> +__rte_internal
> +void idpf_vport_stats_update(struct virtchnl2_vport_stats *oes, struct
> +virtchnl2_vport_stats *nes);
> 
>  #endif /* _IDPF_COMMON_DEVICE_H_ */
> diff --git a/drivers/common/idpf/idpf_common_virtchnl.c
> b/drivers/common/idpf/idpf_common_virtchnl.c
> index 31fadefbd3..40cff34c09 100644
> --- a/drivers/common/idpf/idpf_common_virtchnl.c
> +++ b/drivers/common/idpf/idpf_common_virtchnl.c
> @@ -217,6 +217,7 @@ idpf_vc_cmd_execute(struct idpf_adapter *adapter,
> struct idpf_cmd_info *args)
>       case VIRTCHNL2_OP_UNMAP_QUEUE_VECTOR:
>       case VIRTCHNL2_OP_ALLOC_VECTORS:
>       case VIRTCHNL2_OP_DEALLOC_VECTORS:
> +     case VIRTCHNL2_OP_GET_STATS:
>               /* for init virtchnl ops, need to poll the response */
>               err = idpf_vc_one_msg_read(adapter, args->ops, args-
> >out_size, args->out_buffer);
>               clear_cmd(adapter);
> @@ -806,6 +807,32 @@ idpf_vc_ptype_info_query(struct idpf_adapter
> *adapter)
>       return err;
>  }
> 
> +int
> +idpf_vc_stats_query(struct idpf_vport *vport,
> +             struct virtchnl2_vport_stats **pstats) {
> +     struct idpf_adapter *adapter = vport->adapter;
> +     struct virtchnl2_vport_stats vport_stats;
> +     struct idpf_cmd_info args;
> +     int err;
> +
> +     vport_stats.vport_id = vport->vport_id;
> +     args.ops = VIRTCHNL2_OP_GET_STATS;
> +     args.in_args = (u8 *)&vport_stats;
> +     args.in_args_size = sizeof(vport_stats);
> +     args.out_buffer = adapter->mbx_resp;
> +     args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
> +
> +     err = idpf_vc_cmd_execute(adapter, &args);
> +     if (err) {
> +             DRV_LOG(ERR, "Failed to execute command of
> VIRTCHNL2_OP_GET_STATS");
> +             *pstats = NULL;
> +             return err;
> +     }
> +     *pstats = (struct virtchnl2_vport_stats *)args.out_buffer;
> +     return 0;
> +}
> +
>  #define IDPF_RX_BUF_STRIDE           64
>  int
>  idpf_vc_rxq_config(struct idpf_vport *vport, struct idpf_rx_queue *rxq) diff 
> -
> -git a/drivers/common/idpf/idpf_common_virtchnl.h
> b/drivers/common/idpf/idpf_common_virtchnl.h
> index c105f02836..6b94fd5b8f 100644
> --- a/drivers/common/idpf/idpf_common_virtchnl.h
> +++ b/drivers/common/idpf/idpf_common_virtchnl.h
> @@ -49,4 +49,7 @@ __rte_internal
>  int idpf_vc_rxq_config(struct idpf_vport *vport, struct idpf_rx_queue *rxq);
> __rte_internal  int idpf_vc_txq_config(struct idpf_vport *vport, struct
> idpf_tx_queue *txq);
> +__rte_internal
> +int idpf_vc_stats_query(struct idpf_vport *vport,
> +                     struct virtchnl2_vport_stats **pstats);
>  #endif /* _IDPF_COMMON_VIRTCHNL_H_ */
> diff --git a/drivers/common/idpf/version.map
> b/drivers/common/idpf/version.map index 8b33130bd6..e6a02828ba
> 100644
> --- a/drivers/common/idpf/version.map
> +++ b/drivers/common/idpf/version.map
> @@ -46,6 +46,7 @@ INTERNAL {
>       idpf_vc_rss_key_set;
>       idpf_vc_rss_lut_set;
>       idpf_vc_rxq_config;
> +     idpf_vc_stats_query;
>       idpf_vc_txq_config;
>       idpf_vc_vectors_alloc;
>       idpf_vc_vectors_dealloc;
> @@ -59,6 +60,7 @@ INTERNAL {
>       idpf_vport_irq_map_config;
>       idpf_vport_irq_unmap_config;
>       idpf_vport_rss_config;
> +     idpf_vport_stats_update;
> 
>       local: *;
>  };
> diff --git a/drivers/net/idpf/idpf_ethdev.c b/drivers/net/idpf/idpf_ethdev.c
> index 33f5e90743..02ddb0330a 100644
> --- a/drivers/net/idpf/idpf_ethdev.c
> +++ b/drivers/net/idpf/idpf_ethdev.c
> @@ -140,6 +140,87 @@ idpf_dev_supported_ptypes_get(struct rte_eth_dev
> *dev __rte_unused)
>       return ptypes;
>  }
> 
> +static uint64_t
> +idpf_get_mbuf_alloc_failed_stats(struct rte_eth_dev *dev) {
> +     uint64_t mbuf_alloc_failed = 0;
> +     struct idpf_rx_queue *rxq;
> +     int i = 0;
> +
> +     for (i = 0; i < dev->data->nb_rx_queues; i++) {
> +             rxq = dev->data->rx_queues[i];
> +             mbuf_alloc_failed += __atomic_load_n(&rxq-
> >rx_stats.mbuf_alloc_failed,
> +                                                  __ATOMIC_RELAXED);
> +     }
> +
> +     return mbuf_alloc_failed;
> +}
> +
> +static int
> +idpf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats
> +*stats) {
> +     struct idpf_vport *vport =
> +             (struct idpf_vport *)dev->data->dev_private;
> +     struct virtchnl2_vport_stats *pstats = NULL;
> +     int ret;
> +
> +     ret = idpf_vc_stats_query(vport, &pstats);
> +     if (ret == 0) {
> +             uint8_t crc_stats_len = (dev->data-
> >dev_conf.rxmode.offloads &
> +                                      RTE_ETH_RX_OFFLOAD_KEEP_CRC) ?
> 0 :
> +                                      RTE_ETHER_CRC_LEN;
> +
> +             idpf_vport_stats_update(&vport->eth_stats_offset, pstats);
> +             stats->ipackets = pstats->rx_unicast + pstats->rx_multicast +
> +                             pstats->rx_broadcast - pstats->rx_discards;
> +             stats->opackets = pstats->tx_broadcast + pstats-
> >tx_multicast +
> +                                             pstats->tx_unicast;
> +             stats->imissed = pstats->rx_discards;
> +             stats->oerrors = pstats->tx_errors + pstats->tx_discards;
> +             stats->ibytes = pstats->rx_bytes;
> +             stats->ibytes -= stats->ipackets * crc_stats_len;
> +             stats->obytes = pstats->tx_bytes;
> +
> +             dev->data->rx_mbuf_alloc_failed =
> idpf_get_mbuf_alloc_failed_stats(dev);
> +             stats->rx_nombuf = dev->data->rx_mbuf_alloc_failed;
> +     } else {
> +             PMD_DRV_LOG(ERR, "Get statistics failed");
> +     }
> +     return ret;
> +}
> +
> +static void
> +idpf_reset_mbuf_alloc_failed_stats(struct rte_eth_dev *dev) {
> +     struct idpf_rx_queue *rxq;
> +     int i;
> +
> +     for (i = 0; i < dev->data->nb_rx_queues; i++) {
> +             rxq = dev->data->rx_queues[i];
> +             __atomic_store_n(&rxq->rx_stats.mbuf_alloc_failed, 0,
> __ATOMIC_RELAXED);
> +     }
> +}
> +
> +static int
> +idpf_dev_stats_reset(struct rte_eth_dev *dev) {
> +     struct idpf_vport *vport =
> +             (struct idpf_vport *)dev->data->dev_private;
> +     struct virtchnl2_vport_stats *pstats = NULL;
> +     int ret;
> +
> +     ret = idpf_vc_stats_query(vport, &pstats);
> +     if (ret != 0)
> +             return ret;
> +
> +     /* set stats offset base on current values */
> +     vport->eth_stats_offset = *pstats;
> +
> +     idpf_reset_mbuf_alloc_failed_stats(dev);
> +
> +     return 0;
> +}
> +
>  static int
>  idpf_init_rss(struct idpf_vport *vport)  { @@ -327,6 +408,9 @@
> idpf_dev_start(struct rte_eth_dev *dev)
>               goto err_vport;
>       }
> 
> +     if (idpf_dev_stats_reset(dev))
> +             PMD_DRV_LOG(ERR, "Failed to reset stats");
> +
>       vport->stopped = 0;
> 
>       return 0;
> @@ -606,6 +690,8 @@ static const struct eth_dev_ops idpf_eth_dev_ops = {
>       .tx_queue_release               = idpf_dev_tx_queue_release,
>       .mtu_set                        = idpf_dev_mtu_set,
>       .dev_supported_ptypes_get       = idpf_dev_supported_ptypes_get,
> +     .stats_get                      = idpf_dev_stats_get,
> +     .stats_reset                    = idpf_dev_stats_reset,
>  };
> 
>  static uint16_t
> --
> 2.25.1

Reply via email to