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.

Reply via email to