From: Igor Romanov Date: Fri, 6 Sep 2019 14:34:54 +0000 (+0100) Subject: ethdev: make stats and xstats reset callbacks return int X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=9970a9ad07db7745ca6bc441819b287940ae86ea;p=dpdk.git ethdev: make stats and xstats reset callbacks return int Change return value of the callbacks from void to int. Make implementations across all drivers return negative errno values in case of error conditions. Both callbacks are updated together because a large number of drivers assign the same function to both callbacks. Signed-off-by: Igor Romanov Signed-off-by: Andrew Rybchenko Reviewed-by: Ferruh Yigit --- diff --git a/app/test/virtual_pmd.c b/app/test/virtual_pmd.c index b34df416a2..79156cb85a 100644 --- a/app/test/virtual_pmd.c +++ b/app/test/virtual_pmd.c @@ -197,7 +197,7 @@ virtual_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int virtual_ethdev_stats_reset(struct rte_eth_dev *dev) { struct virtual_ethdev_private *dev_private = dev->data->dev_private; @@ -208,6 +208,8 @@ virtual_ethdev_stats_reset(struct rte_eth_dev *dev) /* Reset internal statistics */ memset(&dev_private->eth_stats, 0, sizeof(dev_private->eth_stats)); + + return 0; } static int diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c index 0495727281..dce76b04e5 100644 --- a/drivers/net/af_packet/rte_eth_af_packet.c +++ b/drivers/net/af_packet/rte_eth_af_packet.c @@ -349,7 +349,7 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *igb_stats) return 0; } -static void +static int eth_stats_reset(struct rte_eth_dev *dev) { unsigned i; @@ -365,6 +365,8 @@ eth_stats_reset(struct rte_eth_dev *dev) internal->tx_queue[i].err_pkts = 0; internal->tx_queue[i].tx_bytes = 0; } + + return 0; } static void diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c index 096815732d..f9686c29e3 100644 --- a/drivers/net/af_xdp/rte_eth_af_xdp.c +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c @@ -463,7 +463,7 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int eth_stats_reset(struct rte_eth_dev *dev) { struct pmd_internals *internals = dev->data->dev_private; @@ -475,6 +475,8 @@ eth_stats_reset(struct rte_eth_dev *dev) memset(&internals->tx_queues[i].stats, 0, sizeof(struct tx_stats)); } + + return 0; } static void diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c index 2b3f8e3bbf..c3642012dd 100644 --- a/drivers/net/ark/ark_ethdev.c +++ b/drivers/net/ark/ark_ethdev.c @@ -39,7 +39,7 @@ static int eth_ark_dev_set_link_up(struct rte_eth_dev *dev); static int eth_ark_dev_set_link_down(struct rte_eth_dev *dev); static int eth_ark_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); -static void eth_ark_dev_stats_reset(struct rte_eth_dev *dev); +static int eth_ark_dev_stats_reset(struct rte_eth_dev *dev); static int eth_ark_set_default_mac_addr(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr); static int eth_ark_macaddr_add(struct rte_eth_dev *dev, @@ -813,7 +813,7 @@ eth_ark_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int eth_ark_dev_stats_reset(struct rte_eth_dev *dev) { uint16_t i; @@ -826,6 +826,8 @@ eth_ark_dev_stats_reset(struct rte_eth_dev *dev) if (ark->user_ext.stats_reset) ark->user_ext.stats_reset(dev, ark->user_data[dev->data->port_id]); + + return 0; } static int diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c index 5018529da1..19742c20d1 100644 --- a/drivers/net/atlantic/atl_ethdev.c +++ b/drivers/net/atlantic/atl_ethdev.c @@ -40,7 +40,7 @@ static int atl_dev_stats_get(struct rte_eth_dev *dev, static int atl_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats, unsigned int n); -static void atl_dev_stats_reset(struct rte_eth_dev *dev); +static int atl_dev_stats_reset(struct rte_eth_dev *dev); static int atl_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size); @@ -975,7 +975,7 @@ atl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int atl_dev_stats_reset(struct rte_eth_dev *dev) { struct atl_adapter *adapter = ATL_DEV_TO_ADAPTER(dev); @@ -987,6 +987,8 @@ atl_dev_stats_reset(struct rte_eth_dev *dev) memset(&hw->curr_stats, 0, sizeof(hw->curr_stats)); memset(&adapter->sw_stats, 0, sizeof(adapter->sw_stats)); + + return 0; } static int diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c index 050901990c..cd747b6beb 100644 --- a/drivers/net/avp/avp_ethdev.c +++ b/drivers/net/avp/avp_ethdev.c @@ -82,7 +82,7 @@ static void avp_dev_tx_queue_release(void *txq); static int avp_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); -static void avp_dev_stats_reset(struct rte_eth_dev *dev); +static int avp_dev_stats_reset(struct rte_eth_dev *dev); #define AVP_MAX_RX_BURST 64 @@ -2275,7 +2275,7 @@ avp_dev_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats) return 0; } -static void +static int avp_dev_stats_reset(struct rte_eth_dev *eth_dev) { struct avp_dev *avp = AVP_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private); @@ -2300,6 +2300,8 @@ avp_dev_stats_reset(struct rte_eth_dev *eth_dev) txq->errors = 0; } } + + return 0; } RTE_PMD_REGISTER_PCI(net_avp, rte_avp_pmd); diff --git a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c index c43b5bfb6f..5036196726 100644 --- a/drivers/net/axgbe/axgbe_ethdev.c +++ b/drivers/net/axgbe/axgbe_ethdev.c @@ -23,7 +23,7 @@ static int axgbe_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete); static int axgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); -static void axgbe_dev_stats_reset(struct rte_eth_dev *dev); +static int axgbe_dev_stats_reset(struct rte_eth_dev *dev); static int axgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info); @@ -337,7 +337,7 @@ axgbe_dev_stats_get(struct rte_eth_dev *dev, return 0; } -static void +static int axgbe_dev_stats_reset(struct rte_eth_dev *dev) { struct axgbe_rx_queue *rxq; @@ -356,6 +356,8 @@ axgbe_dev_stats_reset(struct rte_eth_dev *dev) txq->bytes = 0; txq->errors = 0; } + + return 0; } static int diff --git a/drivers/net/bnxt/bnxt_stats.c b/drivers/net/bnxt/bnxt_stats.c index 69ac2dd914..049ad9e398 100644 --- a/drivers/net/bnxt/bnxt_stats.c +++ b/drivers/net/bnxt/bnxt_stats.c @@ -392,22 +392,25 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev, return rc; } -void bnxt_stats_reset_op(struct rte_eth_dev *eth_dev) +int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev) { struct bnxt *bp = eth_dev->data->dev_private; unsigned int i; + int ret; if (!(bp->flags & BNXT_FLAG_INIT_DONE)) { PMD_DRV_LOG(ERR, "Device Initialization not complete!\n"); - return; + return -EINVAL; } - bnxt_clear_all_hwrm_stat_ctxs(bp); + ret = bnxt_clear_all_hwrm_stat_ctxs(bp); for (i = 0; i < bp->rx_cp_nr_rings; i++) { struct bnxt_rx_queue *rxq = bp->rx_queues[i]; rte_atomic64_clear(&rxq->rx_mbuf_alloc_fail); } + + return ret; } int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev, @@ -543,19 +546,36 @@ int bnxt_dev_xstats_get_names_op(__rte_unused struct rte_eth_dev *eth_dev, return stat_cnt; } -void bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev) +int bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev) { struct bnxt *bp = eth_dev->data->dev_private; + int ret; + + if (bp->flags & BNXT_FLAG_PORT_STATS && BNXT_SINGLE_PF(bp)) { + ret = bnxt_hwrm_port_clr_stats(bp); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Operation failed: %s\n", + strerror(-ret)); + return ret; + } + } - if (bp->flags & BNXT_FLAG_PORT_STATS && BNXT_SINGLE_PF(bp)) - bnxt_hwrm_port_clr_stats(bp); + ret = 0; - if (BNXT_VF(bp)) + if (BNXT_VF(bp)) { PMD_DRV_LOG(ERR, "Operation not supported on a VF device\n"); - if (!BNXT_SINGLE_PF(bp)) + ret = -ENOTSUP; + } + if (!BNXT_SINGLE_PF(bp)) { PMD_DRV_LOG(ERR, "Operation not supported on a MF device\n"); - if (!(bp->flags & BNXT_FLAG_PORT_STATS)) + ret = -ENOTSUP; + } + if (!(bp->flags & BNXT_FLAG_PORT_STATS)) { PMD_DRV_LOG(ERR, "Operation not supported\n"); + ret = -ENOTSUP; + } + + return ret; } int bnxt_dev_xstats_get_by_id_op(struct rte_eth_dev *dev, const uint64_t *ids, diff --git a/drivers/net/bnxt/bnxt_stats.h b/drivers/net/bnxt/bnxt_stats.h index b0f135a5af..3cf2a1b822 100644 --- a/drivers/net/bnxt/bnxt_stats.h +++ b/drivers/net/bnxt/bnxt_stats.h @@ -11,13 +11,13 @@ void bnxt_free_stats(struct bnxt *bp); int bnxt_stats_get_op(struct rte_eth_dev *eth_dev, struct rte_eth_stats *bnxt_stats); -void bnxt_stats_reset_op(struct rte_eth_dev *eth_dev); +int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev); int bnxt_dev_xstats_get_names_op(__rte_unused struct rte_eth_dev *eth_dev, struct rte_eth_xstat_name *xstats_names, __rte_unused unsigned int limit); int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev, struct rte_eth_xstat *xstats, unsigned int n); -void bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev); +int bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev); int bnxt_dev_xstats_get_by_id_op(struct rte_eth_dev *dev, const uint64_t *ids, uint64_t *values, unsigned int limit); int bnxt_dev_xstats_get_names_by_id_op(struct rte_eth_dev *dev, diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c index f9b7b595df..5ff9fcbaf7 100644 --- a/drivers/net/bonding/rte_eth_bond_pmd.c +++ b/drivers/net/bonding/rte_eth_bond_pmd.c @@ -2472,14 +2472,21 @@ bond_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int bond_ethdev_stats_reset(struct rte_eth_dev *dev) { struct bond_dev_private *internals = dev->data->dev_private; int i; + int err; + int ret; - for (i = 0; i < internals->slave_count; i++) - rte_eth_stats_reset(internals->slaves[i].port_id); + for (i = 0, err = 0; i < internals->slave_count; i++) { + ret = rte_eth_stats_reset(internals->slaves[i].port_id); + if (ret != 0) + err = ret; + } + + return err; } static int diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c index be001a0d24..030e0469c3 100644 --- a/drivers/net/cxgbe/cxgbe_ethdev.c +++ b/drivers/net/cxgbe/cxgbe_ethdev.c @@ -724,7 +724,7 @@ static int cxgbe_dev_stats_get(struct rte_eth_dev *eth_dev, /* * Reset port statistics. */ -static void cxgbe_dev_stats_reset(struct rte_eth_dev *eth_dev) +static int cxgbe_dev_stats_reset(struct rte_eth_dev *eth_dev) { struct port_info *pi = eth_dev->data->dev_private; struct adapter *adapter = pi->adapter; @@ -747,6 +747,8 @@ static void cxgbe_dev_stats_reset(struct rte_eth_dev *eth_dev) txq->stats.tx_bytes = 0; txq->stats.mapping_err = 0; } + + return 0; } static int cxgbe_flow_ctrl_get(struct rte_eth_dev *eth_dev, diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c index ad28c110d7..9265b1740e 100644 --- a/drivers/net/dpaa/dpaa_ethdev.c +++ b/drivers/net/dpaa/dpaa_ethdev.c @@ -399,13 +399,15 @@ static int dpaa_eth_stats_get(struct rte_eth_dev *dev, return 0; } -static void dpaa_eth_stats_reset(struct rte_eth_dev *dev) +static int dpaa_eth_stats_reset(struct rte_eth_dev *dev) { struct dpaa_if *dpaa_intf = dev->data->dev_private; PMD_INIT_FUNC_TRACE(); fman_if_stats_reset(dpaa_intf->fif); + + return 0; } static int diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c index d9cc2c3510..363208c0e8 100644 --- a/drivers/net/dpaa2/dpaa2_ethdev.c +++ b/drivers/net/dpaa2/dpaa2_ethdev.c @@ -1429,12 +1429,12 @@ dpaa2_xstats_get_names_by_id( return limit; } -static void +static int dpaa2_dev_stats_reset(struct rte_eth_dev *dev) { struct dpaa2_dev_priv *priv = dev->data->dev_private; struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; - int32_t retcode; + int retcode; int i; struct dpaa2_queue *dpaa2_q; @@ -1442,7 +1442,7 @@ dpaa2_dev_stats_reset(struct rte_eth_dev *dev) if (dpni == NULL) { DPAA2_PMD_ERR("dpni is NULL"); - return; + return -EINVAL; } retcode = dpni_reset_statistics(dpni, CMD_PRI_LOW, priv->token); @@ -1462,11 +1462,11 @@ dpaa2_dev_stats_reset(struct rte_eth_dev *dev) dpaa2_q->tx_pkts = 0; } - return; + return 0; error: DPAA2_PMD_ERR("Operation not completed:Error Code = %d", retcode); - return; + return retcode; }; /* return 0 means link status changed, -1 means not changed */ diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c index 8fe39176af..ea701008a6 100644 --- a/drivers/net/e1000/em_ethdev.c +++ b/drivers/net/e1000/em_ethdev.c @@ -43,7 +43,7 @@ static int eth_em_link_update(struct rte_eth_dev *dev, int wait_to_complete); static int eth_em_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats); -static void eth_em_stats_reset(struct rte_eth_dev *dev); +static int eth_em_stats_reset(struct rte_eth_dev *dev); static int eth_em_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info); static int eth_em_flow_ctrl_get(struct rte_eth_dev *dev, @@ -984,7 +984,7 @@ eth_em_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats) return 0; } -static void +static int eth_em_stats_reset(struct rte_eth_dev *dev) { struct e1000_hw_stats *hw_stats = @@ -995,6 +995,8 @@ eth_em_stats_reset(struct rte_eth_dev *dev) /* Reset software totals */ memset(hw_stats, 0, sizeof(*hw_stats)); + + return 0; } static int diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index a9f6de5d52..f6bfdd6311 100644 --- a/drivers/net/e1000/igb_ethdev.c +++ b/drivers/net/e1000/igb_ethdev.c @@ -98,8 +98,8 @@ static int eth_igb_xstats_get_names(struct rte_eth_dev *dev, static int eth_igb_xstats_get_names_by_id(struct rte_eth_dev *dev, struct rte_eth_xstat_name *xstats_names, const uint64_t *ids, unsigned int limit); -static void eth_igb_stats_reset(struct rte_eth_dev *dev); -static void eth_igb_xstats_reset(struct rte_eth_dev *dev); +static int eth_igb_stats_reset(struct rte_eth_dev *dev); +static int eth_igb_xstats_reset(struct rte_eth_dev *dev); static int eth_igb_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size); static int eth_igb_infos_get(struct rte_eth_dev *dev, @@ -168,7 +168,7 @@ static int eth_igbvf_xstats_get(struct rte_eth_dev *dev, static int eth_igbvf_xstats_get_names(struct rte_eth_dev *dev, struct rte_eth_xstat_name *xstats_names, unsigned limit); -static void eth_igbvf_stats_reset(struct rte_eth_dev *dev); +static int eth_igbvf_stats_reset(struct rte_eth_dev *dev); static int igbvf_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on); static int igbvf_set_vfta(struct e1000_hw *hw, uint16_t vid, bool on); @@ -1870,7 +1870,7 @@ eth_igb_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats) return 0; } -static void +static int eth_igb_stats_reset(struct rte_eth_dev *dev) { struct e1000_hw_stats *hw_stats = @@ -1881,9 +1881,11 @@ eth_igb_stats_reset(struct rte_eth_dev *dev) /* Reset software totals */ memset(hw_stats, 0, sizeof(*hw_stats)); + + return 0; } -static void +static int eth_igb_xstats_reset(struct rte_eth_dev *dev) { struct e1000_hw_stats *stats = @@ -1894,6 +1896,8 @@ eth_igb_xstats_reset(struct rte_eth_dev *dev) /* Reset software totals */ memset(stats, 0, sizeof(*stats)); + + return 0; } static int eth_igb_xstats_get_names(__rte_unused struct rte_eth_dev *dev, @@ -2127,7 +2131,7 @@ eth_igbvf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats) return 0; } -static void +static int eth_igbvf_stats_reset(struct rte_eth_dev *dev) { struct e1000_vf_stats *hw_stats = (struct e1000_vf_stats*) @@ -2139,6 +2143,8 @@ eth_igbvf_stats_reset(struct rte_eth_dev *dev) /* reset HW current stats*/ memset(&hw_stats->gprc, 0, sizeof(*hw_stats) - offsetof(struct e1000_vf_stats, gprc)); + + return 0; } static int diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c index 1ec66d0baf..bd53811fcf 100644 --- a/drivers/net/enetc/enetc_ethdev.c +++ b/drivers/net/enetc/enetc_ethdev.c @@ -492,7 +492,7 @@ int enetc_stats_get(struct rte_eth_dev *dev, return 0; } -static void +static int enetc_stats_reset(struct rte_eth_dev *dev) { struct enetc_eth_hw *hw = @@ -500,6 +500,8 @@ enetc_stats_reset(struct rte_eth_dev *dev) struct enetc_hw *enetc_hw = &hw->hw; enetc_port_wr(enetc_hw, ENETC_PM0_STAT_CONFIG, ENETC_CLEAR_STATS); + + return 0; } static void diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h index 72b1e7956b..579d11872c 100644 --- a/drivers/net/enic/enic.h +++ b/drivers/net/enic/enic.h @@ -304,7 +304,7 @@ void enic_remove(struct enic *enic); int enic_get_link_status(struct enic *enic); int enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats); -void enic_dev_stats_clear(struct enic *enic); +int enic_dev_stats_clear(struct enic *enic); int enic_add_packet_filter(struct enic *enic); int enic_set_mac_address(struct enic *enic, uint8_t *mac_addr); int enic_del_mac_address(struct enic *enic, int mac_index); diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c index 6572815f58..8ab1258d00 100644 --- a/drivers/net/enic/enic_ethdev.c +++ b/drivers/net/enic/enic_ethdev.c @@ -474,12 +474,12 @@ static int enicpmd_dev_stats_get(struct rte_eth_dev *eth_dev, return enic_dev_stats_get(enic, stats); } -static void enicpmd_dev_stats_reset(struct rte_eth_dev *eth_dev) +static int enicpmd_dev_stats_reset(struct rte_eth_dev *eth_dev) { struct enic *enic = pmd_priv(eth_dev); ENICPMD_FUNC_TRACE(); - enic_dev_stats_clear(enic); + return enic_dev_stats_clear(enic); } static uint32_t speed_capa_from_pci_id(struct rte_eth_dev *eth_dev) diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c index f4e76a057a..e507df1f6f 100644 --- a/drivers/net/enic/enic_main.c +++ b/drivers/net/enic/enic_main.c @@ -115,11 +115,18 @@ static void enic_init_soft_stats(struct enic *enic) enic_clear_soft_stats(enic); } -void enic_dev_stats_clear(struct enic *enic) +int enic_dev_stats_clear(struct enic *enic) { - if (vnic_dev_stats_clear(enic->vdev)) + int ret; + + ret = vnic_dev_stats_clear(enic->vdev); + if (ret != 0) { dev_err(enic, "Error in clearing stats\n"); + return ret; + } enic_clear_soft_stats(enic); + + return 0; } int enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats) diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c index ade5d1d75b..91aa56c6f6 100644 --- a/drivers/net/failsafe/failsafe_ops.c +++ b/drivers/net/failsafe/failsafe_ops.c @@ -814,19 +814,31 @@ inc: return 0; } -static void +static int fs_stats_reset(struct rte_eth_dev *dev) { struct sub_device *sdev; uint8_t i; + int ret; fs_lock(dev, 0); FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) { - rte_eth_stats_reset(PORT_ID(sdev)); + ret = rte_eth_stats_reset(PORT_ID(sdev)); + if (ret) { + if (!fs_err(sdev, ret)) + continue; + + ERROR("Operation rte_eth_stats_reset failed for sub_device %d with error %d", + i, ret); + fs_unlock(dev, 0); + return ret; + } memset(&sdev->stats_snapshot, 0, sizeof(struct rte_eth_stats)); } memset(&PRIV(dev)->stats_accumulator, 0, sizeof(struct rte_eth_stats)); fs_unlock(dev, 0); + + return 0; } static void diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c index f0f6290089..e70daa333b 100644 --- a/drivers/net/fm10k/fm10k_ethdev.c +++ b/drivers/net/fm10k/fm10k_ethdev.c @@ -1355,7 +1355,7 @@ fm10k_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int fm10k_stats_reset(struct rte_eth_dev *dev) { struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); @@ -1366,6 +1366,8 @@ fm10k_stats_reset(struct rte_eth_dev *dev) memset(hw_stats, 0, sizeof(*hw_stats)); fm10k_rebind_hw_stats(hw, hw_stats); + + return 0; } static int @@ -3114,7 +3116,11 @@ eth_fm10k_dev_init(struct rte_eth_dev *dev) } /* Reset the hw statistics */ - fm10k_stats_reset(dev); + diag = fm10k_stats_reset(dev); + if (diag != 0) { + PMD_INIT_LOG(ERR, "Stats reset failed: %d", diag); + return diag; + } /* Reset the hw */ diag = fm10k_reset_hw(hw); diff --git a/drivers/net/hinic/base/hinic_pmd_niccfg.c b/drivers/net/hinic/base/hinic_pmd_niccfg.c index 7da0a88749..78012b8d37 100644 --- a/drivers/net/hinic/base/hinic_pmd_niccfg.c +++ b/drivers/net/hinic/base/hinic_pmd_niccfg.c @@ -1131,7 +1131,7 @@ int hinic_set_fast_recycle_mode(void *hwdev, u8 mode) return 0; } -void hinic_clear_vport_stats(struct hinic_hwdev *hwdev) +int hinic_clear_vport_stats(struct hinic_hwdev *hwdev) { struct hinic_clear_vport_stats clear_vport_stats; u16 out_size = sizeof(clear_vport_stats); @@ -1139,7 +1139,7 @@ void hinic_clear_vport_stats(struct hinic_hwdev *hwdev) if (!hwdev) { PMD_DRV_LOG(ERR, "Hwdev is NULL"); - return; + return -EINVAL; } memset(&clear_vport_stats, 0, sizeof(clear_vport_stats)); @@ -1153,10 +1153,13 @@ void hinic_clear_vport_stats(struct hinic_hwdev *hwdev) if (err || !out_size || clear_vport_stats.mgmt_msg_head.status) { PMD_DRV_LOG(ERR, "Failed to clear vport statistics, err: %d, status: 0x%x, out size: 0x%x", err, clear_vport_stats.mgmt_msg_head.status, out_size); + return -EINVAL; } + + return 0; } -void hinic_clear_phy_port_stats(struct hinic_hwdev *hwdev) +int hinic_clear_phy_port_stats(struct hinic_hwdev *hwdev) { struct hinic_clear_port_stats clear_phy_port_stats; u16 out_size = sizeof(clear_phy_port_stats); @@ -1164,7 +1167,7 @@ void hinic_clear_phy_port_stats(struct hinic_hwdev *hwdev) if (!hwdev) { PMD_DRV_LOG(ERR, "Hwdev is NULL"); - return; + return -EINVAL; } memset(&clear_phy_port_stats, 0, sizeof(clear_phy_port_stats)); @@ -1180,7 +1183,10 @@ void hinic_clear_phy_port_stats(struct hinic_hwdev *hwdev) PMD_DRV_LOG(ERR, "Failed to clear phy port statistics, err: %d, status: 0x%x, out size: 0x%x", err, clear_phy_port_stats.mgmt_msg_head.status, out_size); + return -EINVAL; } + + return 0; } int hinic_set_link_status_follow(void *hwdev, diff --git a/drivers/net/hinic/base/hinic_pmd_niccfg.h b/drivers/net/hinic/base/hinic_pmd_niccfg.h index eaa3f2aba2..174b40fa99 100644 --- a/drivers/net/hinic/base/hinic_pmd_niccfg.h +++ b/drivers/net/hinic/base/hinic_pmd_niccfg.h @@ -651,8 +651,8 @@ int hinic_set_fast_recycle_mode(void *hwdev, u8 mode); int hinic_get_base_qpn(void *hwdev, u16 *global_qpn); -void hinic_clear_vport_stats(struct hinic_hwdev *hwdev); +int hinic_clear_vport_stats(struct hinic_hwdev *hwdev); -void hinic_clear_phy_port_stats(struct hinic_hwdev *hwdev); +int hinic_clear_phy_port_stats(struct hinic_hwdev *hwdev); #endif /* _HINIC_PMD_NICCFG_H_ */ diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c index c50cdd9f81..c9a400e149 100644 --- a/drivers/net/hinic/hinic_pmd_ethdev.c +++ b/drivers/net/hinic/hinic_pmd_ethdev.c @@ -1203,14 +1203,17 @@ hinic_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) * @param dev * Pointer to Ethernet device structure. */ -static void hinic_dev_stats_reset(struct rte_eth_dev *dev) +static int hinic_dev_stats_reset(struct rte_eth_dev *dev) { int qid; struct hinic_rxq *rxq = NULL; struct hinic_txq *txq = NULL; struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); + int ret; - hinic_clear_vport_stats(nic_dev->hwdev); + ret = hinic_clear_vport_stats(nic_dev->hwdev); + if (ret != 0) + return ret; for (qid = 0; qid < nic_dev->num_rq; qid++) { rxq = nic_dev->rxqs[qid]; @@ -1221,6 +1224,8 @@ static void hinic_dev_stats_reset(struct rte_eth_dev *dev) txq = nic_dev->txqs[qid]; hinic_txq_stats_reset(txq); } + + return 0; } /** @@ -1229,14 +1234,22 @@ static void hinic_dev_stats_reset(struct rte_eth_dev *dev) * @param dev * Pointer to Ethernet device structure. **/ -static void hinic_dev_xstats_reset(struct rte_eth_dev *dev) +static int hinic_dev_xstats_reset(struct rte_eth_dev *dev) { struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); + int ret; - hinic_dev_stats_reset(dev); + ret = hinic_dev_stats_reset(dev); + if (ret != 0) + return ret; - if (hinic_func_type(nic_dev->hwdev) != TYPE_VF) - hinic_clear_phy_port_stats(nic_dev->hwdev); + if (hinic_func_type(nic_dev->hwdev) != TYPE_VF) { + ret = hinic_clear_phy_port_stats(nic_dev->hwdev); + if (ret != 0) + return ret; + } + + return 0; } static void hinic_gen_random_mac_addr(struct rte_ether_addr *mac_addr) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 79bd3a70c9..f3b5147a80 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -236,7 +236,7 @@ static int i40e_dev_xstats_get(struct rte_eth_dev *dev, static int i40e_dev_xstats_get_names(struct rte_eth_dev *dev, struct rte_eth_xstat_name *xstats_names, unsigned limit); -static void i40e_dev_stats_reset(struct rte_eth_dev *dev); +static int i40e_dev_stats_reset(struct rte_eth_dev *dev); static int i40e_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size); static int i40e_dev_info_get(struct rte_eth_dev *dev, @@ -3313,7 +3313,7 @@ i40e_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) } /* Reset the statistics */ -static void +static int i40e_dev_stats_reset(struct rte_eth_dev *dev) { struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); @@ -3326,6 +3326,8 @@ i40e_dev_stats_reset(struct rte_eth_dev *dev) /* read the stats, reading current register values into offset */ i40e_read_stats_registers(pf, hw); + + return 0; } static uint32_t diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c index 22e5e1409d..c1c7cbaaf6 100644 --- a/drivers/net/i40e/i40e_ethdev_vf.c +++ b/drivers/net/i40e/i40e_ethdev_vf.c @@ -86,7 +86,7 @@ static int i40evf_dev_xstats_get(struct rte_eth_dev *dev, static int i40evf_dev_xstats_get_names(struct rte_eth_dev *dev, struct rte_eth_xstat_name *xstats_names, unsigned limit); -static void i40evf_dev_xstats_reset(struct rte_eth_dev *dev); +static int i40evf_dev_xstats_reset(struct rte_eth_dev *dev); static int i40evf_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on); static int i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask); @@ -950,7 +950,7 @@ i40evf_update_stats(struct i40e_vsi *vsi, i40evf_stat_update_32(&oes->tx_discards, &nes->tx_discards); } -static void +static int i40evf_dev_xstats_reset(struct rte_eth_dev *dev) { int ret; @@ -963,6 +963,8 @@ i40evf_dev_xstats_reset(struct rte_eth_dev *dev) /* set stats offset base on current values */ if (ret == 0) vf->vsi.eth_stats_offset = *pstats; + + return ret; } static int i40evf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev, diff --git a/drivers/net/i40e/i40e_vf_representor.c b/drivers/net/i40e/i40e_vf_representor.c index 7f69e27a24..5f4e372b37 100644 --- a/drivers/net/i40e/i40e_vf_representor.c +++ b/drivers/net/i40e/i40e_vf_representor.c @@ -264,12 +264,12 @@ i40e_vf_representor_stats_get(struct rte_eth_dev *ethdev, return ret; } -static void +static int i40e_vf_representor_stats_reset(struct rte_eth_dev *ethdev) { struct i40e_vf_representor *representor = ethdev->data->dev_private; - rte_pmd_i40e_get_vf_native_stats( + return rte_pmd_i40e_get_vf_native_stats( representor->adapter->eth_dev->data->port_id, representor->vf_id, &representor->stats_offset); } diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index 22a88c88dd..e1c4261b47 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -42,7 +42,7 @@ static int iavf_dev_info_get(struct rte_eth_dev *dev, static const uint32_t *iavf_dev_supported_ptypes_get(struct rte_eth_dev *dev); static int iavf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); -static void iavf_dev_stats_reset(struct rte_eth_dev *dev); +static int iavf_dev_stats_reset(struct rte_eth_dev *dev); static int iavf_dev_promiscuous_enable(struct rte_eth_dev *dev); static int iavf_dev_promiscuous_disable(struct rte_eth_dev *dev); static void iavf_dev_allmulticast_enable(struct rte_eth_dev *dev); @@ -1065,7 +1065,7 @@ iavf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return -EIO; } -static void +static int iavf_dev_stats_reset(struct rte_eth_dev *dev) { int ret; @@ -1077,10 +1077,13 @@ iavf_dev_stats_reset(struct rte_eth_dev *dev) /* read stat values to clear hardware registers */ ret = iavf_query_stats(adapter, &pstats); + if (ret != 0) + return ret; /* set stats offset base on current values */ - if (ret == 0) - vsi->eth_stats_offset = *pstats; + vsi->eth_stats_offset = *pstats; + + return 0; } static int diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c index 17867b9693..46ed708165 100644 --- a/drivers/net/ice/ice_ethdev.c +++ b/drivers/net/ice/ice_ethdev.c @@ -94,7 +94,7 @@ static int ice_get_eeprom(struct rte_eth_dev *dev, struct rte_dev_eeprom_info *eeprom); static int ice_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); -static void ice_stats_reset(struct rte_eth_dev *dev); +static int ice_stats_reset(struct rte_eth_dev *dev); static int ice_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, unsigned int n); static int ice_xstats_get_names(struct rte_eth_dev *dev, @@ -3750,7 +3750,7 @@ ice_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) } /* Reset the statistics */ -static void +static int ice_stats_reset(struct rte_eth_dev *dev) { struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private); @@ -3763,6 +3763,8 @@ ice_stats_reset(struct rte_eth_dev *dev) /* read the stats, reading current register values into offset */ ice_read_stats_registers(pf, hw); + + return 0; } static uint32_t diff --git a/drivers/net/ipn3ke/ipn3ke_representor.c b/drivers/net/ipn3ke/ipn3ke_representor.c index 9079073c95..4bd2d016b4 100644 --- a/drivers/net/ipn3ke/ipn3ke_representor.c +++ b/drivers/net/ipn3ke/ipn3ke_representor.c @@ -2047,7 +2047,7 @@ uint16_t port_id) 0); } -static void +static int ipn3ke_rpst_stats_reset(struct rte_eth_dev *ethdev) { uint16_t port_id = 0; @@ -2058,18 +2058,18 @@ ipn3ke_rpst_stats_reset(struct rte_eth_dev *ethdev) if (!ethdev) { IPN3KE_AFU_PMD_ERR("ethernet device to reset is NULL!"); - return; + return -EINVAL; } afu_dev = RTE_ETH_DEV_TO_AFU(ethdev); if (!afu_dev) { IPN3KE_AFU_PMD_ERR("afu device to reset is NULL!"); - return; + return -EINVAL; } if (!afu_dev->shared.data) { IPN3KE_AFU_PMD_ERR("hardware data to reset is NULL!"); - return; + return -EINVAL; } hw = afu_dev->shared.data; @@ -2077,7 +2077,7 @@ ipn3ke_rpst_stats_reset(struct rte_eth_dev *ethdev) ch = ethdev->data->name; if (!ch) { IPN3KE_AFU_PMD_ERR("ethdev name is NULL!"); - return; + return -EINVAL; } while (ch) { if (*ch == '_') @@ -2088,7 +2088,7 @@ ipn3ke_rpst_stats_reset(struct rte_eth_dev *ethdev) } if (!ch) { IPN3KE_AFU_PMD_ERR("Can not get port_id from ethdev name!"); - return; + return -EINVAL; } port_id = atoi(ch); @@ -2104,6 +2104,8 @@ ipn3ke_rpst_stats_reset(struct rte_eth_dev *ethdev) ipn3ke_rpst_10g_lineside_tx_stats_reset(hw, port_id); ipn3ke_rpst_10g_lineside_rx_stats_reset(hw, port_id); } + + return 0; } static int diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index 023b267d74..493764c1b7 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -164,8 +164,8 @@ static int ixgbevf_dev_xstats_get(struct rte_eth_dev *dev, static int ixgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids, uint64_t *values, unsigned int n); -static void ixgbe_dev_stats_reset(struct rte_eth_dev *dev); -static void ixgbe_dev_xstats_reset(struct rte_eth_dev *dev); +static int ixgbe_dev_stats_reset(struct rte_eth_dev *dev); +static int ixgbe_dev_xstats_reset(struct rte_eth_dev *dev); static int ixgbe_dev_xstats_get_names(struct rte_eth_dev *dev, struct rte_eth_xstat_name *xstats_names, unsigned int size); @@ -255,7 +255,7 @@ static void ixgbevf_intr_disable(struct rte_eth_dev *dev); static void ixgbevf_intr_enable(struct rte_eth_dev *dev); static int ixgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); -static void ixgbevf_dev_stats_reset(struct rte_eth_dev *dev); +static int ixgbevf_dev_stats_reset(struct rte_eth_dev *dev); static int ixgbevf_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on); static void ixgbevf_vlan_strip_queue_set(struct rte_eth_dev *dev, @@ -3317,7 +3317,7 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int ixgbe_dev_stats_reset(struct rte_eth_dev *dev) { struct ixgbe_hw_stats *stats = @@ -3328,6 +3328,8 @@ ixgbe_dev_stats_reset(struct rte_eth_dev *dev) /* Reset software totals */ memset(stats, 0, sizeof(*stats)); + + return 0; } /* This function calculates the number of xstats based on the current config */ @@ -3649,7 +3651,7 @@ ixgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids, return n; } -static void +static int ixgbe_dev_xstats_reset(struct rte_eth_dev *dev) { struct ixgbe_hw_stats *stats = @@ -3666,6 +3668,8 @@ ixgbe_dev_xstats_reset(struct rte_eth_dev *dev) /* Reset software totals */ memset(stats, 0, sizeof(*stats)); memset(macsec_stats, 0, sizeof(*macsec_stats)); + + return 0; } static void @@ -3740,7 +3744,7 @@ ixgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int ixgbevf_dev_stats_reset(struct rte_eth_dev *dev) { struct ixgbevf_hw_stats *hw_stats = (struct ixgbevf_hw_stats *) @@ -3754,6 +3758,8 @@ ixgbevf_dev_stats_reset(struct rte_eth_dev *dev) hw_stats->vfgorc = 0; hw_stats->vfgptc = 0; hw_stats->vfgotc = 0; + + return 0; } static int diff --git a/drivers/net/kni/rte_eth_kni.c b/drivers/net/kni/rte_eth_kni.c index 38a3bd5a05..547e08c3de 100644 --- a/drivers/net/kni/rte_eth_kni.c +++ b/drivers/net/kni/rte_eth_kni.c @@ -318,7 +318,7 @@ eth_kni_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int eth_kni_stats_reset(struct rte_eth_dev *dev) { struct rte_eth_dev_data *data = dev->data; @@ -335,6 +335,8 @@ eth_kni_stats_reset(struct rte_eth_dev *dev) q->tx.pkts = 0; q->tx.bytes = 0; } + + return 0; } static const struct eth_dev_ops eth_kni_ops = { diff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c index e1eaf9eb8a..ceea878591 100644 --- a/drivers/net/liquidio/lio_ethdev.c +++ b/drivers/net/liquidio/lio_ethdev.c @@ -243,17 +243,18 @@ lio_dev_xstats_get_names(struct rte_eth_dev *eth_dev, } /* Reset hw stats for the port */ -static void +static int lio_dev_xstats_reset(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); struct lio_dev_ctrl_cmd ctrl_cmd; struct lio_ctrl_pkt ctrl_pkt; + int ret; if (!lio_dev->intf_open) { lio_dev_err(lio_dev, "Port %d down\n", lio_dev->port_id); - return; + return -EINVAL; } /* flush added to prevent cmd failure @@ -270,19 +271,21 @@ lio_dev_xstats_reset(struct rte_eth_dev *eth_dev) ctrl_pkt.ncmd.s.cmd = LIO_CMD_CLEAR_STATS; ctrl_pkt.ctrl_cmd = &ctrl_cmd; - if (lio_send_ctrl_pkt(lio_dev, &ctrl_pkt)) { + ret = lio_send_ctrl_pkt(lio_dev, &ctrl_pkt); + if (ret != 0) { lio_dev_err(lio_dev, "Failed to send clear stats command\n"); - return; + return ret; } - if (lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd)) { + ret = lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd); + if (ret != 0) { lio_dev_err(lio_dev, "Clear stats command timed out\n"); - return; + return ret; } /* clear stored per queue stats */ - RTE_FUNC_PTR_OR_RET(*eth_dev->dev_ops->stats_reset); - (*eth_dev->dev_ops->stats_reset)(eth_dev); + RTE_FUNC_PTR_OR_ERR_RET(*eth_dev->dev_ops->stats_reset, 0); + return (*eth_dev->dev_ops->stats_reset)(eth_dev); } /* Retrieve the device statistics (# packets in/out, # bytes in/out, etc */ @@ -338,7 +341,7 @@ lio_dev_stats_get(struct rte_eth_dev *eth_dev, return 0; } -static void +static int lio_dev_stats_reset(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); @@ -365,6 +368,8 @@ lio_dev_stats_reset(struct rte_eth_dev *eth_dev) memset(oq_stats, 0, sizeof(struct lio_droq_stats)); } } + + return 0; } static int diff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c index 0d4360e5c2..af260f7a87 100644 --- a/drivers/net/memif/rte_eth_memif.c +++ b/drivers/net/memif/rte_eth_memif.c @@ -968,7 +968,7 @@ memif_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int memif_stats_reset(struct rte_eth_dev *dev) { struct pmd_internals *pmd = dev->data->dev_private; @@ -987,6 +987,8 @@ memif_stats_reset(struct rte_eth_dev *dev) mq->n_pkts = 0; mq->n_bytes = 0; } + + return 0; } static int diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h index 21517d70a2..09d9eaf659 100644 --- a/drivers/net/mlx4/mlx4.h +++ b/drivers/net/mlx4/mlx4.h @@ -217,7 +217,7 @@ int mlx4_set_mc_addr_list(struct rte_eth_dev *dev, struct rte_ether_addr *list, uint32_t num); int mlx4_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on); int mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); -void mlx4_stats_reset(struct rte_eth_dev *dev); +int mlx4_stats_reset(struct rte_eth_dev *dev); int mlx4_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size); int mlx4_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info); diff --git a/drivers/net/mlx4/mlx4_ethdev.c b/drivers/net/mlx4/mlx4_ethdev.c index b5706bb78e..928a81afea 100644 --- a/drivers/net/mlx4/mlx4_ethdev.c +++ b/drivers/net/mlx4/mlx4_ethdev.c @@ -746,8 +746,11 @@ mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) * * @param dev * Pointer to Ethernet device structure. + * + * @return + * alwasy 0 on success */ -void +int mlx4_stats_reset(struct rte_eth_dev *dev) { unsigned int i; @@ -768,6 +771,8 @@ mlx4_stats_reset(struct rte_eth_dev *dev) .idx = txq->stats.idx, }; } + + return 0; } /** diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 0887e6de22..11d7709979 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -769,10 +769,10 @@ void mlx5_allmulticast_disable(struct rte_eth_dev *dev); void mlx5_stats_init(struct rte_eth_dev *dev); int mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); -void mlx5_stats_reset(struct rte_eth_dev *dev); +int mlx5_stats_reset(struct rte_eth_dev *dev); int mlx5_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats, unsigned int n); -void mlx5_xstats_reset(struct rte_eth_dev *dev); +int mlx5_xstats_reset(struct rte_eth_dev *dev); int mlx5_xstats_get_names(struct rte_eth_dev *dev __rte_unused, struct rte_eth_xstat_name *xstats_names, unsigned int n); diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c index cff065f279..205e4fec78 100644 --- a/drivers/net/mlx5/mlx5_stats.c +++ b/drivers/net/mlx5/mlx5_stats.c @@ -434,8 +434,11 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) * * @param dev * Pointer to Ethernet device structure. + * + * @return + * always 0 on success and stats is reset */ -void +int mlx5_stats_reset(struct rte_eth_dev *dev) { struct mlx5_priv *priv = dev->data->dev_private; @@ -458,6 +461,8 @@ mlx5_stats_reset(struct rte_eth_dev *dev) #ifndef MLX5_PMD_SOFT_COUNTERS /* FIXME: reset hardware counters. */ #endif + + return 0; } /** @@ -465,8 +470,12 @@ mlx5_stats_reset(struct rte_eth_dev *dev) * * @param dev * Pointer to Ethernet device structure. + * + * @return + * 0 on success and stats is reset, negative errno value otherwise and + * rte_errno is set. */ -void +int mlx5_xstats_reset(struct rte_eth_dev *dev) { struct mlx5_priv *priv = dev->data->dev_private; @@ -481,7 +490,7 @@ mlx5_xstats_reset(struct rte_eth_dev *dev) if (stats_n < 0) { DRV_LOG(ERR, "port %u cannot get stats: %s", dev->data->port_id, strerror(-stats_n)); - return; + return stats_n; } if (xstats_ctrl->stats_n != stats_n) mlx5_stats_init(dev); @@ -489,10 +498,12 @@ mlx5_xstats_reset(struct rte_eth_dev *dev) if (ret) { DRV_LOG(ERR, "port %u cannot read device counters: %s", dev->data->port_id, strerror(rte_errno)); - return; + return ret; } for (i = 0; i != n; ++i) xstats_ctrl->base[i] = counters[i]; + + return 0; } /** diff --git a/drivers/net/mvneta/mvneta_ethdev.c b/drivers/net/mvneta/mvneta_ethdev.c index 1090af03b1..865ad61aed 100644 --- a/drivers/net/mvneta/mvneta_ethdev.c +++ b/drivers/net/mvneta/mvneta_ethdev.c @@ -48,7 +48,7 @@ struct mvneta_ifnames { static int mvneta_dev_num; -static void mvneta_stats_reset(struct rte_eth_dev *dev); +static int mvneta_stats_reset(struct rte_eth_dev *dev); static int rte_pmd_mvneta_remove(struct rte_vdev_device *vdev); @@ -736,19 +736,24 @@ mvneta_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) * * @param dev * Pointer to Ethernet device structure. + * + * @return + * 0 on success, negative error value otherwise. */ -static void +static int mvneta_stats_reset(struct rte_eth_dev *dev) { struct mvneta_priv *priv = dev->data->dev_private; unsigned int ret; if (!priv->ppio) - return; + return 0; ret = mvneta_stats_get(dev, &priv->prev_stats); if (unlikely(ret)) RTE_LOG(ERR, PMD, "Failed to reset port statistics"); + + return ret; } diff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c index 7babc891ae..0af56350eb 100644 --- a/drivers/net/mvpp2/mrvl_ethdev.c +++ b/drivers/net/mvpp2/mrvl_ethdev.c @@ -1315,15 +1315,18 @@ mrvl_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) * * @param dev * Pointer to Ethernet device structure. + * + * @return + * 0 on success, negative error value otherwise. */ -static void +static int mrvl_stats_reset(struct rte_eth_dev *dev) { struct mrvl_priv *priv = dev->data->dev_private; int i; if (!priv->ppio) - return; + return 0; for (i = 0; i < dev->data->nb_rx_queues; i++) { struct mrvl_rxq *rxq = dev->data->rx_queues[i]; @@ -1341,7 +1344,7 @@ mrvl_stats_reset(struct rte_eth_dev *dev) txq->bytes_sent = 0; } - pp2_ppio_get_statistics(priv->ppio, NULL, 1); + return pp2_ppio_get_statistics(priv->ppio, NULL, 1); } /** @@ -1392,11 +1395,14 @@ mrvl_xstats_get(struct rte_eth_dev *dev, * * @param dev * Pointer to Ethernet device structure. + * + * @return + * 0 on success, negative error value otherwise. */ -static void +static int mrvl_xstats_reset(struct rte_eth_dev *dev) { - mrvl_stats_reset(dev); + return mrvl_stats_reset(dev); } /** diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c index d04a6c8acb..7edfe5ec1e 100644 --- a/drivers/net/netvsc/hn_ethdev.c +++ b/drivers/net/netvsc/hn_ethdev.c @@ -630,7 +630,7 @@ static int hn_dev_stats_get(struct rte_eth_dev *dev, return 0; } -static void +static int hn_dev_stats_reset(struct rte_eth_dev *dev) { unsigned int i; @@ -653,13 +653,20 @@ hn_dev_stats_reset(struct rte_eth_dev *dev) memset(&rxq->stats, 0, sizeof(struct hn_stats)); } + + return 0; } -static void +static int hn_dev_xstats_reset(struct rte_eth_dev *dev) { - hn_dev_stats_reset(dev); - hn_vf_xstats_reset(dev); + int ret; + + ret = hn_dev_stats_reset(dev); + if (ret != 0) + return 0; + + return hn_vf_xstats_reset(dev); } static int diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h index 01f2276482..93c91e2bdb 100644 --- a/drivers/net/netvsc/hn_var.h +++ b/drivers/net/netvsc/hn_var.h @@ -235,14 +235,14 @@ int hn_vf_rx_queue_setup(struct rte_eth_dev *dev, void hn_vf_rx_queue_release(struct hn_data *hv, uint16_t queue_id); int hn_vf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); -void hn_vf_stats_reset(struct rte_eth_dev *dev); +int hn_vf_stats_reset(struct rte_eth_dev *dev); int hn_vf_xstats_get_names(struct rte_eth_dev *dev, struct rte_eth_xstat_name *xstats_names, unsigned int size); int hn_vf_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, unsigned int offset, unsigned int n); -void hn_vf_xstats_reset(struct rte_eth_dev *dev); +int hn_vf_xstats_reset(struct rte_eth_dev *dev); int hn_vf_rss_hash_update(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_conf); int hn_vf_reta_hash_update(struct rte_eth_dev *dev, diff --git a/drivers/net/netvsc/hn_vf.c b/drivers/net/netvsc/hn_vf.c index d133438bbd..5ae4dc9796 100644 --- a/drivers/net/netvsc/hn_vf.c +++ b/drivers/net/netvsc/hn_vf.c @@ -395,9 +395,9 @@ void hn_vf_close(struct rte_eth_dev *dev) rte_spinlock_unlock(&hv->vf_lock); } -void hn_vf_stats_reset(struct rte_eth_dev *dev) +int hn_vf_stats_reset(struct rte_eth_dev *dev) { - VF_ETHDEV_FUNC(dev, rte_eth_stats_reset); + VF_ETHDEV_FUNC_RET_STATUS(dev, rte_eth_stats_reset); } void hn_vf_allmulticast_enable(struct rte_eth_dev *dev) @@ -573,16 +573,21 @@ int hn_vf_xstats_get(struct rte_eth_dev *dev, return count; } -void hn_vf_xstats_reset(struct rte_eth_dev *dev) +int hn_vf_xstats_reset(struct rte_eth_dev *dev) { struct hn_data *hv = dev->data->dev_private; struct rte_eth_dev *vf_dev; + int ret; rte_spinlock_lock(&hv->vf_lock); vf_dev = hn_get_vf_dev(hv); if (vf_dev) - rte_eth_xstats_reset(vf_dev->data->port_id); + ret = rte_eth_xstats_reset(vf_dev->data->port_id); + else + ret = -EINVAL; rte_spinlock_unlock(&hv->vf_lock); + + return ret; } int hn_vf_rss_hash_update(struct rte_eth_dev *dev, diff --git a/drivers/net/nfb/nfb_stats.c b/drivers/net/nfb/nfb_stats.c index 5aa4d0089c..e107dff4b9 100644 --- a/drivers/net/nfb/nfb_stats.c +++ b/drivers/net/nfb/nfb_stats.c @@ -52,7 +52,7 @@ nfb_eth_stats_get(struct rte_eth_dev *dev, return 0; } -void +int nfb_eth_stats_reset(struct rte_eth_dev *dev) { uint16_t i; @@ -74,4 +74,6 @@ nfb_eth_stats_reset(struct rte_eth_dev *dev) tx_queue[i].tx_bytes = 0; tx_queue[i].err_pkts = 0; } + + return 0; } diff --git a/drivers/net/nfb/nfb_stats.h b/drivers/net/nfb/nfb_stats.h index c7d8c8c0b6..ad96ea29b2 100644 --- a/drivers/net/nfb/nfb_stats.h +++ b/drivers/net/nfb/nfb_stats.h @@ -31,8 +31,11 @@ nfb_eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); * * @param dev * Pointer to Ethernet device structure. + * + * @return + * 0 on success, negative errno value otherwise. */ -void +int nfb_eth_stats_reset(struct rte_eth_dev *dev); #endif /* _NFB_STATS_H_ */ diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c index a9858036a9..22a8b2d19e 100644 --- a/drivers/net/nfp/nfp_net.c +++ b/drivers/net/nfp/nfp_net.c @@ -105,7 +105,7 @@ static int nfp_net_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, static int nfp_net_start(struct rte_eth_dev *dev); static int nfp_net_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); -static void nfp_net_stats_reset(struct rte_eth_dev *dev); +static int nfp_net_stats_reset(struct rte_eth_dev *dev); static void nfp_net_stop(struct rte_eth_dev *dev); static uint16_t nfp_net_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts); @@ -1149,7 +1149,7 @@ nfp_net_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return -EINVAL; } -static void +static int nfp_net_stats_reset(struct rte_eth_dev *dev) { int i; @@ -1210,6 +1210,8 @@ nfp_net_stats_reset(struct rte_eth_dev *dev) hw->eth_stats_base.imissed = nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_DISCARDS); + + return 0; } static int diff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c index aec0cab8f9..e2ff41a229 100644 --- a/drivers/net/null/rte_eth_null.c +++ b/drivers/net/null/rte_eth_null.c @@ -315,20 +315,22 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *igb_stats) return 0; } -static void +static int eth_stats_reset(struct rte_eth_dev *dev) { unsigned i; struct pmd_internals *internal; if (dev == NULL) - return; + return -EINVAL; internal = dev->data->dev_private; for (i = 0; i < RTE_DIM(internal->rx_null_queues); i++) internal->rx_null_queues[i].rx_pkts.cnt = 0; for (i = 0; i < RTE_DIM(internal->tx_null_queues); i++) internal->tx_null_queues[i].tx_pkts.cnt = 0; + + return 0; } static void diff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c index 47cea4e9b2..00686ea26a 100644 --- a/drivers/net/octeontx/octeontx_ethdev.c +++ b/drivers/net/octeontx/octeontx_ethdev.c @@ -228,12 +228,12 @@ octeontx_port_stats(struct octeontx_nic *nic, struct rte_eth_stats *stats) return 0; } -static void +static int octeontx_port_stats_clr(struct octeontx_nic *nic) { PMD_INIT_FUNC_TRACE(); - octeontx_bgx_port_stats_clr(nic->port_id); + return octeontx_bgx_port_stats_clr(nic->port_id); } static inline void @@ -549,13 +549,13 @@ octeontx_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return octeontx_port_stats(nic, stats); } -static void +static int octeontx_dev_stats_reset(struct rte_eth_dev *dev) { struct octeontx_nic *nic = octeontx_pmd_priv(dev); PMD_INIT_FUNC_TRACE(); - octeontx_port_stats_clr(nic); + return octeontx_port_stats_clr(nic); } static int diff --git a/drivers/net/octeontx2/otx2_ethdev.h b/drivers/net/octeontx2/otx2_ethdev.h index 8814622e43..0a68f10f46 100644 --- a/drivers/net/octeontx2/otx2_ethdev.h +++ b/drivers/net/octeontx2/otx2_ethdev.h @@ -422,7 +422,7 @@ void otx2_nix_cqe_dump(const struct nix_cqe_hdr_s *cq); /* Stats */ int otx2_nix_dev_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats); -void otx2_nix_dev_stats_reset(struct rte_eth_dev *eth_dev); +int otx2_nix_dev_stats_reset(struct rte_eth_dev *eth_dev); int otx2_nix_queue_stats_mapping(struct rte_eth_dev *dev, uint16_t queue_id, uint8_t stat_idx, @@ -432,7 +432,7 @@ int otx2_nix_xstats_get(struct rte_eth_dev *eth_dev, int otx2_nix_xstats_get_names(struct rte_eth_dev *eth_dev, struct rte_eth_xstat_name *xstats_names, unsigned int limit); -void otx2_nix_xstats_reset(struct rte_eth_dev *eth_dev); +int otx2_nix_xstats_reset(struct rte_eth_dev *eth_dev); int otx2_nix_xstats_get_by_id(struct rte_eth_dev *eth_dev, const uint64_t *ids, diff --git a/drivers/net/octeontx2/otx2_stats.c b/drivers/net/octeontx2/otx2_stats.c index 5eca4184f4..8aaf270a7c 100644 --- a/drivers/net/octeontx2/otx2_stats.c +++ b/drivers/net/octeontx2/otx2_stats.c @@ -131,14 +131,16 @@ otx2_nix_dev_stats_get(struct rte_eth_dev *eth_dev, return 0; } -void +int otx2_nix_dev_stats_reset(struct rte_eth_dev *eth_dev) { struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev); struct otx2_mbox *mbox = dev->mbox; - otx2_mbox_alloc_msg_nix_stats_rst(mbox); - otx2_mbox_process(mbox); + if (otx2_mbox_alloc_msg_nix_stats_rst(mbox) == NULL) + return -ENOMEM; + + return otx2_mbox_process(mbox); } int @@ -296,7 +298,7 @@ otx2_nix_xstats_get_by_id(struct rte_eth_dev *eth_dev, const uint64_t *ids, return n; } -static void +static int nix_queue_stats_reset(struct rte_eth_dev *eth_dev) { struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev); @@ -314,7 +316,7 @@ nix_queue_stats_reset(struct rte_eth_dev *eth_dev) rc = otx2_mbox_process_msg(mbox, (void *)&rsp); if (rc) { otx2_err("Failed to read rq context"); - return; + return rc; } aq = otx2_mbox_alloc_msg_nix_aq_enq(mbox); aq->qidx = i; @@ -336,7 +338,7 @@ nix_queue_stats_reset(struct rte_eth_dev *eth_dev) rc = otx2_mbox_process(mbox); if (rc) { otx2_err("Failed to write rq context"); - return; + return rc; } } @@ -348,7 +350,7 @@ nix_queue_stats_reset(struct rte_eth_dev *eth_dev) rc = otx2_mbox_process_msg(mbox, (void *)&rsp); if (rc) { otx2_err("Failed to read sq context"); - return; + return rc; } aq = otx2_mbox_alloc_msg_nix_aq_enq(mbox); aq->qidx = i; @@ -368,20 +370,27 @@ nix_queue_stats_reset(struct rte_eth_dev *eth_dev) rc = otx2_mbox_process(mbox); if (rc) { otx2_err("Failed to write sq context"); - return; + return rc; } } + + return 0; } -void +int otx2_nix_xstats_reset(struct rte_eth_dev *eth_dev) { struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev); struct otx2_mbox *mbox = dev->mbox; + int ret; + + if (otx2_mbox_alloc_msg_nix_stats_rst(mbox) == NULL) + return -ENOMEM; - otx2_mbox_alloc_msg_nix_stats_rst(mbox); - otx2_mbox_process(mbox); + ret = otx2_mbox_process(mbox); + if (ret != 0) + return ret; /* Reset queue stats */ - nix_queue_stats_reset(eth_dev); + return nix_queue_stats_reset(eth_dev); } diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c index 50a0655a33..5801915a82 100644 --- a/drivers/net/pcap/rte_eth_pcap.c +++ b/drivers/net/pcap/rte_eth_pcap.c @@ -703,7 +703,7 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int eth_stats_reset(struct rte_eth_dev *dev) { unsigned int i; @@ -719,6 +719,8 @@ eth_stats_reset(struct rte_eth_dev *dev) internal->tx_queue[i].tx_stat.bytes = 0; internal->tx_queue[i].tx_stat.err_pkts = 0; } + + return 0; } static void diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c index 4f324a6d5f..1da34ce6bc 100644 --- a/drivers/net/qede/qede_ethdev.c +++ b/drivers/net/qede/qede_ethdev.c @@ -1710,7 +1710,7 @@ qede_get_xstats(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, return stat_idx; } -static void +static int qede_reset_xstats(struct rte_eth_dev *dev) { struct qede_dev *qdev = dev->data->dev_private; @@ -1718,6 +1718,8 @@ qede_reset_xstats(struct rte_eth_dev *dev) ecore_reset_vport_stats(edev); qede_reset_queue_stats(qdev, true); + + return 0; } int qede_dev_set_link_state(struct rte_eth_dev *eth_dev, bool link_up) @@ -1747,13 +1749,15 @@ static int qede_dev_set_link_down(struct rte_eth_dev *eth_dev) return qede_dev_set_link_state(eth_dev, false); } -static void qede_reset_stats(struct rte_eth_dev *eth_dev) +static int qede_reset_stats(struct rte_eth_dev *eth_dev) { struct qede_dev *qdev = eth_dev->data->dev_private; struct ecore_dev *edev = &qdev->edev; ecore_reset_vport_stats(edev); qede_reset_queue_stats(qdev, false); + + return 0; } static void qede_allmulticast_enable(struct rte_eth_dev *eth_dev) diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c index 686246032e..c6733ee2b1 100644 --- a/drivers/net/ring/rte_eth_ring.c +++ b/drivers/net/ring/rte_eth_ring.c @@ -191,7 +191,7 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int eth_stats_reset(struct rte_eth_dev *dev) { unsigned int i; @@ -201,6 +201,8 @@ eth_stats_reset(struct rte_eth_dev *dev) internal->rx_ring_queues[i].rx_pkts.cnt = 0; for (i = 0; i < dev->data->nb_tx_queues; i++) internal->tx_ring_queues[i].tx_pkts.cnt = 0; + + return 0; } static void diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index 5faf14b674..fc6a9800e6 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -637,7 +637,7 @@ unlock: return -ret; } -static void +static int sfc_stats_reset(struct rte_eth_dev *dev) { struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev); @@ -650,12 +650,15 @@ sfc_stats_reset(struct rte_eth_dev *dev) * will be scheduled to be done during the next port start */ port->mac_stats_reset_pending = B_TRUE; - return; + return 0; } rc = sfc_port_reset_mac_stats(sa); if (rc != 0) sfc_err(sa, "failed to reset statistics (rc = %d)", rc); + + SFC_ASSERT(rc >= 0); + return -rc; } static int diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c index 2f3811b67f..0f1ff04c9c 100644 --- a/drivers/net/szedata2/rte_eth_szedata2.c +++ b/drivers/net/szedata2/rte_eth_szedata2.c @@ -1111,7 +1111,7 @@ eth_stats_get(struct rte_eth_dev *dev, return 0; } -static void +static int eth_stats_reset(struct rte_eth_dev *dev) { uint16_t i; @@ -1130,6 +1130,8 @@ eth_stats_reset(struct rte_eth_dev *dev) txq->tx_bytes = 0; txq->err_pkts = 0; } + + return 0; } static void diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c index 41612ce838..3572bbe6c4 100644 --- a/drivers/net/tap/rte_eth_tap.c +++ b/drivers/net/tap/rte_eth_tap.c @@ -986,7 +986,7 @@ tap_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *tap_stats) return 0; } -static void +static int tap_stats_reset(struct rte_eth_dev *dev) { int i; @@ -1002,6 +1002,8 @@ tap_stats_reset(struct rte_eth_dev *dev) pmd->txq[i].stats.errs = 0; pmd->txq[i].stats.obytes = 0; } + + return 0; } static void diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c index edc956bb3d..b93d45712e 100644 --- a/drivers/net/thunderx/nicvf_ethdev.c +++ b/drivers/net/thunderx/nicvf_ethdev.c @@ -362,7 +362,7 @@ nicvf_dev_supported_ptypes_get(struct rte_eth_dev *dev) return ptypes; } -static void +static int nicvf_dev_stats_reset(struct rte_eth_dev *dev) { int i; @@ -370,6 +370,7 @@ nicvf_dev_stats_reset(struct rte_eth_dev *dev) struct nicvf *nic = nicvf_pmd_priv(dev); uint16_t rx_start, rx_end; uint16_t tx_start, tx_end; + int ret; /* Reset all primary nic counters */ nicvf_rx_range(dev, nic, &rx_start, &rx_end); @@ -380,7 +381,9 @@ nicvf_dev_stats_reset(struct rte_eth_dev *dev) for (i = tx_start; i <= tx_end; i++) txqs |= (0x3 << (i * 2)); - nicvf_mbox_reset_stat_counters(nic, 0x3FFF, 0x1F, rxqs, txqs); + ret = nicvf_mbox_reset_stat_counters(nic, 0x3FFF, 0x1F, rxqs, txqs); + if (ret != 0) + return ret; /* Reset secondary nic queue counters */ for (i = 0; i < nic->sqs_count; i++) { @@ -396,8 +399,12 @@ nicvf_dev_stats_reset(struct rte_eth_dev *dev) for (i = tx_start; i <= tx_end; i++) txqs |= (0x3 << ((i % MAX_SND_QUEUES_PER_QS) * 2)); - nicvf_mbox_reset_stat_counters(snic, 0, 0, rxqs, txqs); + ret = nicvf_mbox_reset_stat_counters(snic, 0, 0, rxqs, txqs); + if (ret != 0) + return ret; } + + return 0; } /* Promiscuous mode enabled by default in LMAC to VF 1:1 map configuration */ diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index 74cc7361b2..c3ba602767 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -216,7 +216,7 @@ static const struct vhost_xstats_name_off vhost_txport_stat_strings[] = { #define VHOST_NB_XSTATS_TXPORT (sizeof(vhost_txport_stat_strings) / \ sizeof(vhost_txport_stat_strings[0])) -static void +static int vhost_dev_xstats_reset(struct rte_eth_dev *dev) { struct vhost_queue *vq = NULL; @@ -234,6 +234,8 @@ vhost_dev_xstats_reset(struct rte_eth_dev *dev) continue; memset(&vq->stats, 0, sizeof(vq->stats)); } + + return 0; } static int @@ -1119,7 +1121,7 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int eth_stats_reset(struct rte_eth_dev *dev) { struct vhost_queue *vq; @@ -1140,6 +1142,8 @@ eth_stats_reset(struct rte_eth_dev *dev) vq->stats.bytes = 0; vq->stats.missed_pkts = 0; } + + return 0; } static void diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 1ba4aa37e8..0b03b4f99a 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -61,7 +61,7 @@ static int virtio_dev_xstats_get(struct rte_eth_dev *dev, static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev, struct rte_eth_xstat_name *xstats_names, unsigned limit); -static void virtio_dev_stats_reset(struct rte_eth_dev *dev); +static int virtio_dev_stats_reset(struct rte_eth_dev *dev); static void virtio_dev_free_mbufs(struct rte_eth_dev *dev); static int virtio_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on); @@ -1076,7 +1076,7 @@ virtio_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int virtio_dev_stats_reset(struct rte_eth_dev *dev) { unsigned int i; @@ -1107,6 +1107,8 @@ virtio_dev_stats_reset(struct rte_eth_dev *dev) memset(rxvq->stats.size_bins, 0, sizeof(rxvq->stats.size_bins[0]) * 8); } + + return 0; } static void diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c index bfe978c4a5..4201af6e37 100644 --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c @@ -76,7 +76,7 @@ static int vmxnet3_dev_link_update(struct rte_eth_dev *dev, static void vmxnet3_hw_stats_save(struct vmxnet3_hw *hw); static int vmxnet3_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); -static void vmxnet3_dev_stats_reset(struct rte_eth_dev *dev); +static int vmxnet3_dev_stats_reset(struct rte_eth_dev *dev); static int vmxnet3_dev_xstats_get_names(struct rte_eth_dev *dev, struct rte_eth_xstat_name *xstats, unsigned int n); @@ -1125,7 +1125,7 @@ vmxnet3_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int vmxnet3_dev_stats_reset(struct rte_eth_dev *dev) { unsigned int i; @@ -1147,6 +1147,8 @@ vmxnet3_dev_stats_reset(struct rte_eth_dev *dev) memcpy(&hw->snapshot_rx_stats[i], &rxStats, sizeof(hw->snapshot_rx_stats[0])); } + + return 0; } static int diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index 933d71e512..cdd854c41d 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -2039,12 +2039,16 @@ int rte_eth_stats_reset(uint16_t port_id) { struct rte_eth_dev *dev; + int ret; RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); dev = &rte_eth_devices[port_id]; RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_reset, -ENOTSUP); - (*dev->dev_ops->stats_reset)(dev); + ret = (*dev->dev_ops->stats_reset)(dev); + if (ret != 0) + return eth_err(port_id, ret); + dev->data->rx_mbuf_alloc_failed = 0; return 0; @@ -2529,10 +2533,8 @@ rte_eth_xstats_reset(uint16_t port_id) dev = &rte_eth_devices[port_id]; /* implemented by the driver */ - if (dev->dev_ops->xstats_reset != NULL) { - (*dev->dev_ops->xstats_reset)(dev); - return 0; - } + if (dev->dev_ops->xstats_reset != NULL) + return eth_err(port_id, (*dev->dev_ops->xstats_reset)(dev)); /* fallback to default */ return rte_eth_stats_reset(port_id); diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h index 328503d1be..4ea85795ff 100644 --- a/lib/librte_ethdev/rte_ethdev.h +++ b/lib/librte_ethdev/rte_ethdev.h @@ -2137,6 +2137,7 @@ int rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats); * - (0) if device notified to reset stats. * - (-ENOTSUP) if hardware doesn't support. * - (-ENODEV) if *port_id* invalid. + * - (<0): Error code of the driver stats reset function. */ int rte_eth_stats_reset(uint16_t port_id); @@ -2289,6 +2290,7 @@ int rte_eth_xstats_get_id_by_name(uint16_t port_id, const char *xstat_name, * - (-ENOTSUP) if pmd doesn't support both * extended stats and basic stats reset. * - (-ENODEV) if *port_id* invalid. + * - (<0): Error code of the driver xstats reset function. */ int rte_eth_xstats_reset(uint16_t port_id); diff --git a/lib/librte_ethdev/rte_ethdev_core.h b/lib/librte_ethdev/rte_ethdev_core.h index 552da38c8a..6e985bb7d8 100644 --- a/lib/librte_ethdev/rte_ethdev_core.h +++ b/lib/librte_ethdev/rte_ethdev_core.h @@ -116,8 +116,26 @@ typedef int (*eth_stats_get_t)(struct rte_eth_dev *dev, struct rte_eth_stats *igb_stats); /**< @internal Get global I/O statistics of an Ethernet device. */ -typedef void (*eth_stats_reset_t)(struct rte_eth_dev *dev); -/**< @internal Reset global I/O statistics of an Ethernet device to 0. */ +/** + * @internal + * Reset global I/O statistics of an Ethernet device to 0. + * + * @param dev + * ethdev handle of port. + * + * @return + * Negative errno value on error, 0 on success. + * + * @retval 0 + * Success, statistics has been reset. + * @retval -ENOTSUP + * Resetting statistics is not supported. + * @retval -EINVAL + * Resetting statistics is not valid. + * @retval -ENOMEM + * Not enough memory to get the stats. + */ +typedef int (*eth_stats_reset_t)(struct rte_eth_dev *dev); typedef int (*eth_xstats_get_t)(struct rte_eth_dev *dev, struct rte_eth_xstat *stats, unsigned n); @@ -129,8 +147,26 @@ typedef int (*eth_xstats_get_by_id_t)(struct rte_eth_dev *dev, unsigned int n); /**< @internal Get extended stats of an Ethernet device. */ -typedef void (*eth_xstats_reset_t)(struct rte_eth_dev *dev); -/**< @internal Reset extended stats of an Ethernet device. */ +/** + * @internal + * Reset extended stats of an Ethernet device. + * + * @param dev + * ethdev handle of port. + * + * @return + * Negative errno value on error, 0 on success. + * + * @retval 0 + * Success, statistics has been reset. + * @retval -ENOTSUP + * Resetting statistics is not supported. + * @retval -EINVAL + * Resetting statistics is not valid. + * @retval -ENOMEM + * Not enough memory to get the stats. + */ +typedef int (*eth_xstats_reset_t)(struct rte_eth_dev *dev); typedef int (*eth_xstats_get_names_t)(struct rte_eth_dev *dev, struct rte_eth_xstat_name *xstats_names, unsigned size);