On Thu, 11 Sep 2025 23:17:51 -0700 Dimon Zhao <dimon.z...@nebula-matrix.com> wrote:
> +static int nbl_dev_update_hw_xstats(struct nbl_dev_mgt *dev_mgt, struct > rte_eth_xstat *xstats, > + u16 hw_xstats_cnt, u16 *xstats_cnt) > +{ > + struct nbl_dev_net_mgt *net_dev = dev_mgt->net_dev; > + struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt); > + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); > + int i; > + u16 count = *xstats_cnt; > + > + disp_ops->get_private_stat_data(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), > + common->eth_id, net_dev->hw_xstats, > + net_dev->hw_xstats_size); > + for (i = 0; i < hw_xstats_cnt; i++) { > + xstats[count].value = net_dev->hw_xstats[i] - > dev_mgt->net_dev->hw_xstats_offset[i]; > + xstats[count].id = count; > + count++; > + } > + > + *xstats_cnt = count; > + return 0; > +} > + > +int nbl_xstats_get(struct rte_eth_dev *eth_dev, struct rte_eth_xstat > *xstats, unsigned int n) > +{ > + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); > + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); > + struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt); > + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); > + int ret = 0; > + u16 txrx_xstats_cnt = 0, hw_xstats_cnt = 0, xstats_cnt = 0; > + > + if (!xstats) > + return 0; > + > + ret = disp_ops->get_txrx_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), > &txrx_xstats_cnt); > + if (!common->is_vf) > + ret |= > disp_ops->get_hw_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), > + &hw_xstats_cnt); > + if (ret) > + return -EIO; > + > + if (n < (txrx_xstats_cnt + hw_xstats_cnt)) > + return txrx_xstats_cnt + hw_xstats_cnt; > + > + if (txrx_xstats_cnt) > + ret = > disp_ops->get_txrx_xstats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), > + xstats, &xstats_cnt); > + if (hw_xstats_cnt) > + ret |= nbl_dev_update_hw_xstats(dev_mgt, xstats, hw_xstats_cnt, > &xstats_cnt); > + > + if (ret) > + return -EIO; > + > + return xstats_cnt; > +} > + > +int nbl_xstats_get_names(struct rte_eth_dev *eth_dev, > + struct rte_eth_xstat_name *xstats_names, > + __rte_unused unsigned int limit) > +{ > + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); > + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); > + struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt); > + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); > + u16 txrx_xstats_cnt = 0, hw_xstats_cnt = 0, xstats_cnt = 0; > + int ret = 0; > + > + ret = disp_ops->get_txrx_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), > &txrx_xstats_cnt); > + if (!common->is_vf) > + ret |= > disp_ops->get_hw_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), > + &hw_xstats_cnt); > + if (ret) > + return -EIO; > + > + if (!xstats_names) > + return txrx_xstats_cnt + hw_xstats_cnt; > + > + if (txrx_xstats_cnt) > + ret = > disp_ops->get_txrx_xstats_names(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), > + xstats_names, > &xstats_cnt); > + if (hw_xstats_cnt) > + ret |= > disp_ops->get_hw_xstats_names(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), > + xstats_names, &xstats_cnt); > + if (ret) > + return -EIO; > + > + return xstats_cnt; > +} > + You need to check the limit value. The API is designed so that application is allowed to request only a subset of the counters.