net/mlx5: add out of buffer counter to extended statistic
authorShahaf Shuler <shahafs@mellanox.com>
Tue, 14 Feb 2017 14:31:06 +0000 (16:31 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 4 Apr 2017 13:52:50 +0000 (15:52 +0200)
This commit adds RX out of buffer counter to xstats report.
The counter counts the number of dropped occurred due to lack of buffers
on device RX queues.

Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
Acked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
drivers/net/mlx5/mlx5.h
drivers/net/mlx5/mlx5_ethdev.c
drivers/net/mlx5/mlx5_stats.c

index 879da5e..2b4345a 100644 (file)
@@ -197,6 +197,8 @@ struct priv *mlx5_get_priv(struct rte_eth_dev *dev);
 int mlx5_is_secondary(void);
 int priv_get_ifname(const struct priv *, char (*)[IF_NAMESIZE]);
 int priv_ifreq(const struct priv *, int req, struct ifreq *);
+int priv_is_ib_cntr(const char *);
+int priv_get_cntr_sysfs(struct priv *, const char *, uint64_t *);
 int priv_get_num_vfs(struct priv *, uint16_t *);
 int priv_get_mtu(struct priv *, uint16_t *);
 int priv_set_flags(struct priv *, unsigned int, unsigned int);
index 2145965..6b64f44 100644 (file)
@@ -233,6 +233,23 @@ try_dev_id:
        return 0;
 }
 
+/**
+ * Check if the counter is located on ib counters file.
+ *
+ * @param[in] cntr
+ *   Counter name.
+ *
+ * @return
+ *   1 if counter is located on ib counters file , 0 otherwise.
+ */
+int
+priv_is_ib_cntr(const char *cntr)
+{
+       if (!strcmp(cntr, "out_of_buffer"))
+               return 1;
+       return 0;
+}
+
 /**
  * Read from sysfs entry.
  *
@@ -260,10 +277,15 @@ priv_sysfs_read(const struct priv *priv, const char *entry,
        if (priv_get_ifname(priv, &ifname))
                return -1;
 
-       MKSTR(path, "%s/device/net/%s/%s", priv->ctx->device->ibdev_path,
-             ifname, entry);
-
-       file = fopen(path, "rb");
+       if (priv_is_ib_cntr(entry)) {
+               MKSTR(path, "%s/ports/1/hw_counters/%s",
+                     priv->ctx->device->ibdev_path, entry);
+               file = fopen(path, "rb");
+       } else {
+               MKSTR(path, "%s/device/net/%s/%s",
+                     priv->ctx->device->ibdev_path, ifname, entry);
+               file = fopen(path, "rb");
+       }
        if (file == NULL)
                return -1;
        ret = fread(buf, 1, size, file);
@@ -468,6 +490,30 @@ priv_get_mtu(struct priv *priv, uint16_t *mtu)
        return 0;
 }
 
+/**
+ * Read device counter from sysfs.
+ *
+ * @param priv
+ *   Pointer to private structure.
+ * @param name
+ *   Counter name.
+ * @param[out] cntr
+ *   Counter output buffer.
+ *
+ * @return
+ *   0 on success, -1 on failure and errno is set.
+ */
+int
+priv_get_cntr_sysfs(struct priv *priv, const char *name, uint64_t *cntr)
+{
+       unsigned long ulong_ctr;
+
+       if (priv_get_sysfs_ulong(priv, name, &ulong_ctr) == -1)
+               return -1;
+       *cntr = ulong_ctr;
+       return 0;
+}
+
 /**
  * Set device MTU.
  *
index 20c957e..a48ebea 100644 (file)
@@ -125,6 +125,10 @@ static const struct mlx5_counter_ctrl mlx5_counters_init[] = {
                .dpdk_name = "tx_errors_phy",
                .ctr_name = "tx_errors_phy",
        },
+       {
+               .dpdk_name = "rx_out_of_buffer",
+               .ctr_name = "out_of_buffer",
+       },
 };
 
 static const unsigned int xstats_n = RTE_DIM(mlx5_counters_init);
@@ -159,9 +163,15 @@ priv_read_dev_counters(struct priv *priv, uint64_t *stats)
                WARN("unable to read statistic values from device");
                return -1;
        }
-       for (i = 0; i != xstats_n; ++i)
-               stats[i] = (uint64_t)
-                          et_stats->data[xstats_ctrl->dev_table_idx[i]];
+       for (i = 0; i != xstats_n; ++i) {
+               if (priv_is_ib_cntr(mlx5_counters_init[i].ctr_name))
+                       priv_get_cntr_sysfs(priv,
+                                           mlx5_counters_init[i].ctr_name,
+                                           &stats[i]);
+               else
+                       stats[i] = (uint64_t)
+                               et_stats->data[xstats_ctrl->dev_table_idx[i]];
+       }
        return 0;
 }
 
@@ -233,6 +243,8 @@ priv_xstats_init(struct priv *priv)
                }
        }
        for (j = 0; j != xstats_n; ++j) {
+               if (priv_is_ib_cntr(mlx5_counters_init[i].ctr_name))
+                       continue;
                if (xstats_ctrl->dev_table_idx[j] >= dev_stats_n) {
                        WARN("counter \"%s\" is not recognized",
                             mlx5_counters_init[j].dpdk_name);