net/failsafe: add timestamp to stats snapshot
authorMatan Azrad <matan@mellanox.com>
Sat, 21 Oct 2017 20:54:46 +0000 (20:54 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 26 Oct 2017 00:33:01 +0000 (02:33 +0200)
Fail-safe attempts to read an ultimate statistics on removal time; if
that fails, it uses the latest recorded snapshot.

This patch adds timestamp for each stats snapshot to allow a time report
since the last snapshot in case of the above failure.

By this way, the user can estimate the stats read accuracy.

Signed-off-by: Matan Azrad <matan@mellanox.com>
Acked-by: Gaetan Rivet <gaetan.rivet@6wind.com>
drivers/net/failsafe/failsafe_ether.c
drivers/net/failsafe/failsafe_ops.c
drivers/net/failsafe/failsafe_private.h

index 0282891..21392e5 100644 (file)
@@ -35,6 +35,7 @@
 
 #include <rte_flow.h>
 #include <rte_flow_driver.h>
+#include <rte_cycles.h>
 
 #include "failsafe_private.h"
 
@@ -317,12 +318,18 @@ fs_dev_stats_save(struct sub_device *sdev)
 
        /* Attempt to read current stats. */
        err = rte_eth_stats_get(PORT_ID(sdev), &stats);
-       if (err)
-               WARN("Could not access latest statistics from sub-device %d,"
-                        " using latest snapshot.\n", SUB_ID(sdev));
+       if (err) {
+               uint64_t timestamp = sdev->stats_snapshot.timestamp;
+
+               WARN("Could not access latest statistics from sub-device %d.\n",
+                        SUB_ID(sdev));
+               if (timestamp != 0)
+                       WARN("Using latest snapshot taken before %"PRIu64" seconds.\n",
+                                (rte_rdtsc() - timestamp) / rte_get_tsc_hz());
+       }
        failsafe_stats_increment(&PRIV(sdev->fs_dev)->stats_accumulator,
-                       err ? &sdev->stats_snapshot : &stats);
-       memset(&sdev->stats_snapshot, 0, sizeof(struct rte_eth_stats));
+                       err ? &sdev->stats_snapshot.stats : &stats);
+       memset(&sdev->stats_snapshot, 0, sizeof(sdev->stats_snapshot));
 }
 
 static inline int
index d360965..f460551 100644 (file)
@@ -38,6 +38,7 @@
 #include <rte_ethdev.h>
 #include <rte_malloc.h>
 #include <rte_flow.h>
+#include <rte_cycles.h>
 
 #include "failsafe_private.h"
 
@@ -592,13 +593,18 @@ fs_stats_get(struct rte_eth_dev *dev,
 
        rte_memcpy(stats, &PRIV(dev)->stats_accumulator, sizeof(*stats));
        FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {
-               ret = rte_eth_stats_get(PORT_ID(sdev), &sdev->stats_snapshot);
+               struct rte_eth_stats *snapshot = &sdev->stats_snapshot.stats;
+               uint64_t *timestamp = &sdev->stats_snapshot.timestamp;
+
+               ret = rte_eth_stats_get(PORT_ID(sdev), snapshot);
                if (ret) {
                        ERROR("Operation rte_eth_stats_get failed for sub_device %d with error %d",
                                  i, ret);
+                       *timestamp = 0;
                        return ret;
                }
-               failsafe_stats_increment(stats, &sdev->stats_snapshot);
+               *timestamp = rte_rdtsc();
+               failsafe_stats_increment(stats, snapshot);
        }
        return 0;
 }
index d343ebf..d81cc3c 100644 (file)
@@ -93,6 +93,11 @@ enum dev_state {
        DEV_STARTED,
 };
 
+struct fs_stats {
+       struct rte_eth_stats stats;
+       uint64_t timestamp;
+};
+
 struct sub_device {
        /* Exhaustive DPDK device description */
        struct rte_devargs devargs;
@@ -103,7 +108,7 @@ struct sub_device {
        /* Device state machine */
        enum dev_state state;
        /* Last stats snapshot passed to user */
-       struct rte_eth_stats stats_snapshot;
+       struct fs_stats stats_snapshot;
        /* Some device are defined as a command line */
        char *cmdline;
        /* fail-safe device backreference */