dpdk: rework extended stats 27/19927/2
authorFilip Tehlar <ftehlar@cisco.com>
Mon, 3 Jun 2019 08:13:21 +0000 (08:13 +0000)
committerDamjan Marion <dmarion@me.com>
Tue, 4 Jun 2019 07:46:49 +0000 (07:46 +0000)
Change-Id: I421192e1921d4c9c5486a6dcca745582aebf4e3e
Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
src/plugins/dpdk/device/device.c
src/plugins/dpdk/device/dpdk.h
src/plugins/dpdk/device/dpdk_priv.h
src/plugins/dpdk/device/format.c

index e4a92f0..836357f 100644 (file)
@@ -397,17 +397,7 @@ dpdk_clear_hw_interface_counters (u32 instance)
   dpdk_main_t *dm = &dpdk_main;
   dpdk_device_t *xd = vec_elt_at_index (dm->devices, instance);
 
-  /*
-   * Set the "last_cleared_stats" to the current stats, so that
-   * things appear to clear from a display perspective.
-   */
-  dpdk_update_counters (xd, vlib_time_now (dm->vlib_main));
-
-  clib_memcpy_fast (&xd->last_cleared_stats, &xd->stats, sizeof (xd->stats));
-  clib_memcpy_fast (xd->last_cleared_xstats, xd->xstats,
-                   vec_len (xd->last_cleared_xstats) *
-                   sizeof (xd->last_cleared_xstats[0]));
-
+  rte_eth_xstats_reset (xd->port_id);
 }
 
 static clib_error_t *
index eadf35d..a1c5224 100644 (file)
@@ -248,7 +248,6 @@ typedef struct
   struct rte_eth_stats last_stats;
   struct rte_eth_stats last_cleared_stats;
   struct rte_eth_xstat *xstats;
-  struct rte_eth_xstat *last_cleared_xstats;
   f64 time_last_stats_update;
   dpdk_port_type_t port_type;
 
index e0e0682..0b1fe92 100644 (file)
@@ -52,26 +52,26 @@ _(log-level)
 static inline void
 dpdk_get_xstats (dpdk_device_t * xd)
 {
+  int len, ret;
+
   if (!(xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP))
     return;
-  int len;
-  if ((len = rte_eth_xstats_get (xd->port_id, NULL, 0)) > 0)
-    {
-      vec_validate (xd->xstats, len - 1);
-      vec_validate (xd->last_cleared_xstats, len - 1);
 
-      len =
-       rte_eth_xstats_get (xd->port_id, xd->xstats, vec_len (xd->xstats));
-
-      ASSERT (vec_len (xd->xstats) == len);
-      ASSERT (vec_len (xd->last_cleared_xstats) == len);
+  len = rte_eth_xstats_get (xd->port_id, NULL, 0);
+  if (len < 0)
+    return;
 
-      _vec_len (xd->xstats) = len;
-      _vec_len (xd->last_cleared_xstats) = len;
+  vec_validate (xd->xstats, len - 1);
 
+  ret = rte_eth_xstats_get (xd->port_id, xd->xstats, len);
+  if (ret < 0 || ret > len)
+    {
+      _vec_len (xd->xstats) = 0;
+      return;
     }
-}
 
+  _vec_len (xd->xstats) = len;
+}
 
 static inline void
 dpdk_update_counters (dpdk_device_t * xd, f64 now)
index b7ceda0..be2349d 100644 (file)
@@ -659,35 +659,32 @@ format_dpdk_device (u8 * s, va_list * args)
 
   u8 *xs = 0;
   u32 i = 0;
-  struct rte_eth_xstat *xstat, *last_xstat;
+  struct rte_eth_xstat *xstat;
   struct rte_eth_xstat_name *xstat_names = 0;
-  int len = rte_eth_xstats_get_names (xd->port_id, NULL, 0);
+  int len = vec_len (xd->xstats);
   vec_validate (xstat_names, len - 1);
-  rte_eth_xstats_get_names (xd->port_id, xstat_names, len);
+  int ret = rte_eth_xstats_get_names (xd->port_id, xstat_names, len);
 
-  ASSERT (vec_len (xd->xstats) == vec_len (xd->last_cleared_xstats));
-
-  /* *INDENT-OFF* */
-  vec_foreach_index(i, xd->xstats)
+  if (ret < 0 || ret > len)
     {
-      u64 delta = 0;
-      xstat = vec_elt_at_index(xd->xstats, i);
-      last_xstat = vec_elt_at_index(xd->last_cleared_xstats, i);
-
-      delta = xstat->value - last_xstat->value;
-      if (verbose == 2 || (verbose && delta))
+      /* *INDENT-OFF* */
+      vec_foreach_index(i, xd->xstats)
         {
-          /* format_c_identifier doesn't like c strings inside vector */
-          u8 * name = format(0,"%s", xstat_names[i].name);
-          xs = format(xs, "\n%U%-38U%16Lu",
-                      format_white_space, indent + 4,
-                      format_c_identifier, name, delta);
-          vec_free(name);
+          xstat = vec_elt_at_index(xd->xstats, i);
+          if (verbose == 2 || (verbose && xstat->value))
+            {
+              /* format_c_identifier doesn't like c strings inside vector */
+              u8 * name = format(0,"%s", xstat_names[i].name);
+              xs = format(xs, "\n%U%-38U%16Lu",
+                          format_white_space, indent + 4,
+                          format_c_identifier, name, xstat->value);
+              vec_free(name);
+            }
         }
-    }
-  /* *INDENT-ON* */
+      /* *INDENT-ON* */
 
-  vec_free (xstat_names);
+      vec_free (xstat_names);
+    }
 
   if (xs)
     {