[dpdk-dev] [PATCH v2] net/failsafe: stat support enhancement
Gaëtan Rivet
gaetan.rivet at 6wind.com
Thu Sep 7 14:19:08 CEST 2017
Hi Matan,
You should send your v[N] In-Reply-To the Message-Id of your v[N-1]
to help people reading.
On Thu, Sep 07, 2017 at 02:31:13PM +0300, Matan Azrad wrote:
> The previous stats code returned only the current TX sub
> device stats.
>
> This enhancement extends it to return the sum of all sub
> devices stats with history of removed sub-devices.
>
> Dedicated stats accumulator saves the stat history of all
> sub device remove events.
>
> Each failsafe sub device contains the last stats asked by
> the user and updates the accumulator in removal time.
>
> I would like to implement ultimate snapshot on removal time.
> The stats_get API needs to be changed to return error in the
> case it is too late to retrieve statistics.
> By this way, failsafe can get stats snapshot in removal interrupt
> callback for each PMD which can give stats after removal event.
>
> Signed-off-by: Matan Azrad <matan at mellanox.com>
Acked-by: Gaetan Rivet <gaetan.rivet at 6wind.com>
> ---
> drivers/net/failsafe/failsafe_ether.c | 35 ++++++++++++++++++++++++++++++++-
> drivers/net/failsafe/failsafe_ops.c | 16 +++++++++++----
> drivers/net/failsafe/failsafe_private.h | 5 +++++
> 3 files changed, 51 insertions(+), 5 deletions(-)
>
>
> V2:
> 1. Fix failsafe conventions.
> 2. Move the stats saving from the interrupt to the remove func.
>
>
> diff --git a/drivers/net/failsafe/failsafe_ether.c b/drivers/net/failsafe/failsafe_ether.c
> index a3a8cce..dc2e6d1 100644
> --- a/drivers/net/failsafe/failsafe_ether.c
> +++ b/drivers/net/failsafe/failsafe_ether.c
> @@ -308,6 +308,14 @@ fs_dev_remove(struct sub_device *sdev)
> failsafe_hotplug_alarm_install(sdev->fs_dev);
> }
>
> +static void
> +fs_dev_stats_save(struct sub_device *sdev)
> +{
> + failsafe_stats_increment(&PRIV(sdev->fs_dev)->stats_accumulator,
> + &sdev->stats_snapshot);
> + memset(&sdev->stats_snapshot, 0, sizeof(struct rte_eth_stats));
> +}
> +
> static inline int
> fs_rxtx_clean(struct sub_device *sdev)
> {
> @@ -329,8 +337,10 @@ failsafe_dev_remove(struct rte_eth_dev *dev)
> uint8_t i;
>
> FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE)
> - if (sdev->remove && fs_rxtx_clean(sdev))
> + if (sdev->remove && fs_rxtx_clean(sdev)) {
> + fs_dev_stats_save(sdev);
> fs_dev_remove(sdev);
> + }
> }
>
> int
> @@ -399,6 +409,29 @@ failsafe_eth_dev_state_sync(struct rte_eth_dev *dev)
> return ret;
> }
>
> +void
> +failsafe_stats_increment(struct rte_eth_stats *to, struct rte_eth_stats *from)
> +{
> + uint32_t i;
> +
> + RTE_ASSERT(to != NULL && from != NULL);
> + to->ipackets += from->ipackets;
> + to->opackets += from->opackets;
> + to->ibytes += from->ibytes;
> + to->obytes += from->obytes;
> + to->imissed += from->imissed;
> + to->ierrors += from->ierrors;
> + to->oerrors += from->oerrors;
> + to->rx_nombuf += from->rx_nombuf;
> + for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
> + to->q_ipackets[i] += from->q_ipackets[i];
> + to->q_opackets[i] += from->q_opackets[i];
> + to->q_ibytes[i] += from->q_ibytes[i];
> + to->q_obytes[i] += from->q_obytes[i];
> + to->q_errors[i] += from->q_errors[i];
> + }
> +}
> +
> int
> failsafe_eth_rmv_event_callback(uint8_t port_id __rte_unused,
> enum rte_eth_event_type event __rte_unused,
> diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c
> index ff9ad15..e0f1b0b 100644
> --- a/drivers/net/failsafe/failsafe_ops.c
> +++ b/drivers/net/failsafe/failsafe_ops.c
> @@ -586,9 +586,14 @@ static void
> fs_stats_get(struct rte_eth_dev *dev,
> struct rte_eth_stats *stats)
> {
> - if (TX_SUBDEV(dev) == NULL)
> - return;
> - rte_eth_stats_get(PORT_ID(TX_SUBDEV(dev)), stats);
> + struct sub_device *sdev;
> + uint8_t i;
> +
> + rte_memcpy(stats, &PRIV(dev)->stats_accumulator, sizeof(*stats));
> + FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {
> + rte_eth_stats_get(PORT_ID(sdev), &sdev->stats_snapshot);
> + failsafe_stats_increment(stats, &sdev->stats_snapshot);
> + }
> }
>
> static void
> @@ -597,8 +602,11 @@ fs_stats_reset(struct rte_eth_dev *dev)
> struct sub_device *sdev;
> uint8_t i;
>
> - FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE)
> + FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {
> rte_eth_stats_reset(PORT_ID(sdev));
> + memset(&sdev->stats_snapshot, 0, sizeof(struct rte_eth_stats));
> + }
> + memset(&PRIV(dev)->stats_accumulator, 0, sizeof(struct rte_eth_stats));
> }
>
> /**
> diff --git a/drivers/net/failsafe/failsafe_private.h b/drivers/net/failsafe/failsafe_private.h
> index 0361cf4..4861974 100644
> --- a/drivers/net/failsafe/failsafe_private.h
> +++ b/drivers/net/failsafe/failsafe_private.h
> @@ -102,6 +102,8 @@ struct sub_device {
> uint8_t sid;
> /* Device state machine */
> enum dev_state state;
> + /* Last stats snapshot passed to user */
> + struct rte_eth_stats stats_snapshot;
> /* Some device are defined as a command line */
> char *cmdline;
> /* fail-safe device backreference */
> @@ -140,6 +142,7 @@ struct fs_priv {
> * synchronized state.
> */
> enum dev_state state;
> + struct rte_eth_stats stats_accumulator;
> unsigned int pending_alarm:1; /* An alarm is pending */
> /* flow isolation state */
> int flow_isolated:1;
> @@ -180,6 +183,8 @@ int failsafe_eal_uninit(struct rte_eth_dev *dev);
>
> int failsafe_eth_dev_state_sync(struct rte_eth_dev *dev);
> void failsafe_dev_remove(struct rte_eth_dev *dev);
> +void failsafe_stats_increment(struct rte_eth_stats *to,
> + struct rte_eth_stats *from);
> int failsafe_eth_rmv_event_callback(uint8_t port_id,
> enum rte_eth_event_type type,
> void *arg, void *out);
> --
> 2.7.4
>
--
Gaëtan Rivet
6WIND
More information about the dev
mailing list