[dpdk-dev] [PATCH v3 1/3] net/i40e: fix clear xstats bug in vf port
Wu, Jingjing
jingjing.wu at intel.com
Tue Sep 19 04:58:36 CEST 2017
> -----Original Message-----
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Wei Zhao
> Sent: Monday, September 18, 2017 2:18 PM
> To: dev at dpdk.org
> Cc: Zhao1, Wei <wei.zhao1 at intel.com>
> Subject: [dpdk-dev] [PATCH v3 1/3] net/i40e: fix clear xstats bug in vf port
>
> There is a bug in vf clear xstats command, it do not record the statics data in
> offset struct member.So, vf need to keep record of xstats data from pf and
> update the statics according to offset.
>
> Fixes: da61cd0849766 ("i40evf: add extended stats")
>
> Signed-off-by: Wei Zhao <wei.zhao1 at intel.com>
>
> ---
>
> Changes in v2:
>
> fix patch log check warning.
>
> ---
>
> changes in v3:
>
> remove nic_stats_display protect to a new patch
> ---
> drivers/net/i40e/i40e_ethdev_vf.c | 64
> ++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 63 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/i40e/i40e_ethdev_vf.c
> b/drivers/net/i40e/i40e_ethdev_vf.c
> index 38c3adc..806ff9e 100644
> --- a/drivers/net/i40e/i40e_ethdev_vf.c
> +++ b/drivers/net/i40e/i40e_ethdev_vf.c
> @@ -888,16 +888,74 @@ i40evf_update_stats(struct rte_eth_dev *dev, struct
> i40e_eth_stats **pstats)
> return 0;
> }
>
> +static void
> +i40evf_stat_update_48(uint64_t *offset,
> + uint64_t *stat)
> +{
> + if (*stat >= *offset)
> + *stat = *stat - *offset;
> + else
> + *stat = (uint64_t)((*stat +
> + ((uint64_t)1 << I40E_48_BIT_WIDTH)) - *offset);
> +
> + *stat &= I40E_48_BIT_MASK;
> +}
> +
> +static void
> +i40evf_stat_update_32(uint64_t *offset,
> + uint64_t *stat)
> +{
> + if (*stat >= *offset)
> + *stat = (uint64_t)(*stat - *offset);
> + else
> + *stat = (uint64_t)((*stat +
> + ((uint64_t)1 << I40E_32_BIT_WIDTH)) - *offset); }
The type of count is 64 bits. Is that correct to use 1 << I40E_32_BIT_WIDTH?
> +
> +static void
> +i40evf_update_vsi_stats(struct i40e_vsi *vsi,
> + struct i40e_eth_stats *nes)
> +{
> + struct i40e_eth_stats *oes = &vsi->eth_stats_offset;
> +
> + i40evf_stat_update_48(&oes->rx_bytes,
> + &nes->rx_bytes);
> + i40evf_stat_update_48(&oes->rx_unicast,
> + &nes->rx_unicast);
> + i40evf_stat_update_48(&oes->rx_multicast,
> + &nes->rx_multicast);
> + i40evf_stat_update_48(&oes->rx_broadcast,
> + &nes->rx_broadcast);
> + i40evf_stat_update_32(&oes->rx_discards,
> + &nes->rx_discards);
> + i40evf_stat_update_32(&oes->rx_unknown_protocol,
> + &nes->rx_unknown_protocol);
> + i40evf_stat_update_48(&oes->tx_bytes,
> + &nes->tx_bytes);
> + i40evf_stat_update_48(&oes->tx_unicast,
> + &nes->tx_unicast);
> + i40evf_stat_update_48(&oes->tx_multicast,
> + &nes->tx_multicast);
> + i40evf_stat_update_48(&oes->tx_broadcast,
> + &nes->tx_broadcast);
> + i40evf_stat_update_32(&oes->tx_errors, &nes->tx_errors);
> + i40evf_stat_update_32(&oes->tx_discards, &nes->tx_discards); }
> +
> static int
> i40evf_get_statistics(struct rte_eth_dev *dev, struct rte_eth_stats *stats) {
> int ret;
> struct i40e_eth_stats *pstats = NULL;
> + struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data-
> >dev_private);
> + struct i40e_vsi *vsi = &vf->vsi;
>
> ret = i40evf_update_stats(dev, &pstats);
> if (ret != 0)
> return 0;
>
> + i40evf_update_vsi_stats(vsi, pstats);
> +
It looks like, with this change, the static gotten by user the incensement from the last query?
If so, I don't think it is our expected.
The names of functions are similar. Could you help to refine the code?
For example, merge i40evf_dev_stats_get and i40evf_get_statistics to be one function.
Rename i40evf_update_stats like i40evf_query_stats, and chang i40evf_update_vsi_stats
To be i40evf_update_stats? I think it would be clearer, what do you think?
Thanks
Jingjing
More information about the dev
mailing list