From 0f60ff8af3dd72bb1fa8f13886a80d110d78c7b0 Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Thu, 30 Mar 2017 17:58:42 +0200 Subject: dpdk: add support for Mellanox ConnectX-5 devices Change-Id: I3ed2834a326eac50a7cb4faa592f42fd06325d5a Signed-off-by: Damjan Marion --- ...t-of-buffer-counter-to-extended-statistic.patch | 135 +++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 dpdk/dpdk-17.02_patches/0001-dpdk-dev-net-mlx5-add-out-of-buffer-counter-to-extended-statistic.patch (limited to 'dpdk/dpdk-17.02_patches/0001-dpdk-dev-net-mlx5-add-out-of-buffer-counter-to-extended-statistic.patch') diff --git a/dpdk/dpdk-17.02_patches/0001-dpdk-dev-net-mlx5-add-out-of-buffer-counter-to-extended-statistic.patch b/dpdk/dpdk-17.02_patches/0001-dpdk-dev-net-mlx5-add-out-of-buffer-counter-to-extended-statistic.patch new file mode 100644 index 00000000..3ebf5e8a --- /dev/null +++ b/dpdk/dpdk-17.02_patches/0001-dpdk-dev-net-mlx5-add-out-of-buffer-counter-to-extended-statistic.patch @@ -0,0 +1,135 @@ +diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h +index 879da5e..2b4345a 100644 +--- a/drivers/net/mlx5/mlx5.h ++++ b/drivers/net/mlx5/mlx5.h +@@ -197,6 +197,8 @@ struct mlx5_secondary_data { + 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); +diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c +index 2145965..6b64f44 100644 +--- a/drivers/net/mlx5/mlx5_ethdev.c ++++ b/drivers/net/mlx5/mlx5_ethdev.c +@@ -234,6 +234,23 @@ struct priv * + } + + /** ++ * 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. + * + * @param[in] priv +@@ -260,10 +277,15 @@ struct priv * + 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); +@@ -469,6 +491,30 @@ struct priv * + } + + /** ++ * 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. + * + * @param priv +diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c +index 20c957e..a48ebea 100644 +--- a/drivers/net/mlx5/mlx5_stats.c ++++ b/drivers/net/mlx5/mlx5_stats.c +@@ -125,6 +125,10 @@ struct mlx5_counter_ctrl { + .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 @@ struct mlx5_counter_ctrl { + 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 @@ struct mlx5_counter_ctrl { + } + } + 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); -- cgit 1.2.3-korg