Thanks, will update module name. And there is no warning when checked by ./devtools/check-git-log.sh.
> -----Original Message----- > From: Zhang, Qi Z <qi.z.zh...@intel.com> > Sent: Wednesday, February 8, 2023 10:00 AM > To: Liu, Mingxia <mingxia....@intel.com>; dev@dpdk.org; Wu, Jingjing > <jingjing...@intel.com>; Xing, Beilei <beilei.x...@intel.com> > Subject: RE: [PATCH v6 1/6] common/idpf: add hw statistics > > > > > -----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