From: Xiaoyu Min <jackmin@mellanox.com>
To: jerinjacobk@gmail.com, orika@mellanox.com,
viacheslavo@mellanox.com, matan@mellanox.com,
rasland@mellanox.com, Shahaf Shuler <shahafs@mellanox.com>
Cc: dev@dpdk.org, Xueming Li <xuemingl@mellanox.com>
Subject: [dpdk-dev] [PATCH 2/5] net/mlx5: support flow dump API
Date: Thu, 16 Jan 2020 12:14:14 +0200 [thread overview]
Message-ID: <87ca94513977186064949d272c5785597f664d20.1579168182.git.jackmin@mellanox.com> (raw)
In-Reply-To: <cover.1579168182.git.jackmin@mellanox.com>
Dump fdb/nic_rx/nic_tx raw flow data into specified file.
Signed-off-by: Xueming Li <xuemingl@mellanox.com>
Signed-off-by: Xiaoyu Min <jackmin@mellanox.com>
---
drivers/net/mlx5/Makefile | 7 ++++++-
drivers/net/mlx5/meson.build | 2 ++
drivers/net/mlx5/mlx5.h | 4 ++++
drivers/net/mlx5/mlx5_devx_cmds.c | 35 +++++++++++++++++++++++++++++++
drivers/net/mlx5/mlx5_flow.c | 24 +++++++++++++++++++++
drivers/net/mlx5/mlx5_glue.c | 13 ++++++++++++
drivers/net/mlx5/mlx5_glue.h | 1 +
7 files changed, 85 insertions(+), 1 deletion(-)
diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile
index c5cf4397ac..6e5921b292 100644
--- a/drivers/net/mlx5/Makefile
+++ b/drivers/net/mlx5/Makefile
@@ -8,7 +8,7 @@ include $(RTE_SDK)/mk/rte.vars.mk
LIB = librte_pmd_mlx5.a
LIB_GLUE = $(LIB_GLUE_BASE).$(LIB_GLUE_VERSION)
LIB_GLUE_BASE = librte_pmd_mlx5_glue.so
-LIB_GLUE_VERSION = 19.08.0
+LIB_GLUE_VERSION = 19.11.0
# Sources.
SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5.c
@@ -203,6 +203,11 @@ mlx5_autoconf.h.new: $(RTE_SDK)/buildtools/auto-config-h.sh
infiniband/mlx5dv.h \
func mlx5dv_dr_action_create_flow_meter \
$(AUTOCONF_OUTPUT)
+ $Q sh -- '$<' '$@' \
+ HAVE_MLX5_DR_FLOW_DUMP \
+ infiniband/mlx5dv.h \
+ func mlx5dv_dump_dr_domain \
+ $(AUTOCONF_OUTPUT)
$Q sh -- '$<' '$@' \
HAVE_MLX5DV_MMAP_GET_NC_PAGES_CMD \
infiniband/mlx5dv.h \
diff --git a/drivers/net/mlx5/meson.build b/drivers/net/mlx5/meson.build
index d6b32db794..d7ef032afb 100644
--- a/drivers/net/mlx5/meson.build
+++ b/drivers/net/mlx5/meson.build
@@ -186,6 +186,8 @@ if build
'RDMA_NLDEV_ATTR_PORT_INDEX' ],
[ 'HAVE_RDMA_NLDEV_ATTR_NDEV_INDEX', 'rdma/rdma_netlink.h',
'RDMA_NLDEV_ATTR_NDEV_INDEX' ],
+ [ 'HAVE_MLX5_DR_FLOW_DUMP', 'infiniband/mlx5dv.h',
+ 'mlx5dv_dump_dr_domain'],
]
config = configuration_data()
foreach arg:has_sym_args
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index c3df8256ce..047181b32e 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -975,6 +975,8 @@ struct mlx5_flow_counter *mlx5_counter_alloc(struct rte_eth_dev *dev);
void mlx5_counter_free(struct rte_eth_dev *dev, struct mlx5_flow_counter *cnt);
int mlx5_counter_query(struct rte_eth_dev *dev, struct mlx5_flow_counter *cnt,
bool clear, uint64_t *pkts, uint64_t *bytes);
+int mlx5_flow_dev_dump(struct rte_eth_dev *dev, FILE *file,
+ struct rte_flow_error *error);
/* mlx5_mp.c */
void mlx5_mp_req_start_rxtx(struct rte_eth_dev *dev);
@@ -1049,6 +1051,8 @@ struct mlx5_devx_obj *mlx5_devx_cmd_create_tis
(struct ibv_context *ctx, struct mlx5_devx_tis_attr *tis_attr);
struct mlx5_devx_obj *mlx5_devx_cmd_create_td(struct ibv_context *ctx);
+int mlx5_devx_cmd_flow_dump(struct mlx5_ibv_shared *sh, FILE *file);
+
/* mlx5_flow_meter.c */
int mlx5_flow_meter_ops_get(struct rte_eth_dev *dev, void *arg);
diff --git a/drivers/net/mlx5/mlx5_devx_cmds.c b/drivers/net/mlx5/mlx5_devx_cmds.c
index 9893287ba8..d6bf15689d 100644
--- a/drivers/net/mlx5/mlx5_devx_cmds.c
+++ b/drivers/net/mlx5/mlx5_devx_cmds.c
@@ -927,3 +927,38 @@ mlx5_devx_cmd_create_td(struct ibv_context *ctx)
transport_domain);
return td;
}
+
+/**
+ * Dump all flows to file.
+ *
+ * @param[in] sh
+ * Pointer to context.
+ * @param[out] file
+ * Pointer to file stream.
+ *
+ * @return
+ * 0 on success, a nagative value otherwise.
+ */
+int
+mlx5_devx_cmd_flow_dump(struct mlx5_ibv_shared *sh __rte_unused,
+ FILE *file __rte_unused)
+{
+ int ret = 0;
+
+#ifdef HAVE_MLX5_DR_FLOW_DUMP
+ if (sh->fdb_domain) {
+ ret = mlx5_glue->dr_dump_domain(file, sh->fdb_domain);
+ if (ret)
+ return ret;
+ }
+ assert(sh->rx_domain);
+ ret = mlx5_glue->dr_dump_domain(file, sh->rx_domain);
+ if (ret)
+ return ret;
+ assert(sh->tx_domain);
+ ret = mlx5_glue->dr_dump_domain(file, sh->tx_domain);
+#else
+ ret = ENOTSUP;
+#endif
+ return -ret;
+}
diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
index cb9d265f6f..0126cd8f92 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -236,6 +236,7 @@ static const struct rte_flow_ops mlx5_flow_ops = {
.flush = mlx5_flow_flush,
.isolate = mlx5_flow_isolate,
.query = mlx5_flow_query,
+ .dev_dump = mlx5_flow_dev_dump,
};
/* Convert FDIR request to Generic flow. */
@@ -5679,3 +5680,26 @@ mlx5_flow_discover_mreg_c(struct rte_eth_dev *dev)
config->flow_mreg_c[n] = REG_NONE;
return 0;
}
+
+/**
+ * Dump flow raw hw data to file
+ *
+ * @param[in] dev
+ * The pointer to Ethernet device.
+ * @param[in] file
+ * A pointer to a file for output.
+ * @param[out] error
+ * Perform verbose error reporting if not NULL. PMDs initialize this
+ * structure in case of error only.
+ * @return
+ * 0 on success, a nagative value otherwise.
+ */
+int
+mlx5_flow_dev_dump(struct rte_eth_dev *dev,
+ FILE *file,
+ struct rte_flow_error *error __rte_unused)
+{
+ struct mlx5_priv *priv = dev->data->dev_private;
+
+ return mlx5_devx_cmd_flow_dump(priv->sh, file);
+}
diff --git a/drivers/net/mlx5/mlx5_glue.c b/drivers/net/mlx5/mlx5_glue.c
index 0917bf28d6..4906eebc01 100644
--- a/drivers/net/mlx5/mlx5_glue.c
+++ b/drivers/net/mlx5/mlx5_glue.c
@@ -1037,6 +1037,18 @@ mlx5_glue_devx_port_query(struct ibv_context *ctx,
#endif
}
+static int
+mlx5_glue_dr_dump_domain(FILE *file, void *domain)
+{
+#ifdef HAVE_MLX5_DR_FLOW_DUMP
+ return mlx5dv_dump_dr_domain(file, domain);
+#else
+ RTE_SET_USED(file);
+ RTE_SET_USED(domain);
+ return -ENOTSUP;
+#endif
+}
+
alignas(RTE_CACHE_LINE_SIZE)
const struct mlx5_glue *mlx5_glue = &(const struct mlx5_glue){
.version = MLX5_GLUE_VERSION,
@@ -1134,4 +1146,5 @@ const struct mlx5_glue *mlx5_glue = &(const struct mlx5_glue){
.devx_umem_dereg = mlx5_glue_devx_umem_dereg,
.devx_qp_query = mlx5_glue_devx_qp_query,
.devx_port_query = mlx5_glue_devx_port_query,
+ .dr_dump_domain = mlx5_glue_dr_dump_domain,
};
diff --git a/drivers/net/mlx5/mlx5_glue.h b/drivers/net/mlx5/mlx5_glue.h
index 6442f1eba8..6771a18c64 100644
--- a/drivers/net/mlx5/mlx5_glue.h
+++ b/drivers/net/mlx5/mlx5_glue.h
@@ -256,6 +256,7 @@ struct mlx5_glue {
int (*devx_port_query)(struct ibv_context *ctx,
uint32_t port_num,
struct mlx5dv_devx_port *mlx5_devx_port);
+ int (*dr_dump_domain)(FILE *file, void *domain);
};
const struct mlx5_glue *mlx5_glue;
--
2.24.1
next prev parent reply other threads:[~2020-01-16 10:15 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-16 10:14 [dpdk-dev] [PATCH 0/5] ethdev: add API to dump device internal flow info Xiaoyu Min
2020-01-16 10:14 ` [dpdk-dev] [PATCH 1/5] " Xiaoyu Min
2020-01-16 10:37 ` Jerin Jacob
2020-01-16 13:29 ` Ori Kam
2020-01-16 20:37 ` Ferruh Yigit
2020-01-16 22:56 ` Stephen Hemminger
2020-01-17 9:20 ` Ferruh Yigit
2020-01-16 10:14 ` Xiaoyu Min [this message]
2020-01-16 10:14 ` [dpdk-dev] [PATCH 3/5] app/testpmd: new flow dump CLI Xiaoyu Min
2020-01-16 14:10 ` Ori Kam
2020-01-16 10:14 ` [dpdk-dev] [PATCH 4/5] net/mlx5: add socket server for external tools Xiaoyu Min
2020-01-17 8:47 ` Slava Ovsiienko
2020-01-17 9:01 ` Jack Min
2020-01-16 10:14 ` [dpdk-dev] [PATCH 5/5] doc: update mlx5 document for flow dump feature Xiaoyu Min
2020-01-17 11:55 ` [dpdk-dev] [PATCH v2 0/5] ethdev: add API to dump device internal flow info Xiaoyu Min
2020-01-17 11:55 ` [dpdk-dev] [PATCH v2 1/5] " Xiaoyu Min
2020-01-17 19:26 ` Ferruh Yigit
2020-01-17 11:56 ` [dpdk-dev] [PATCH v2 2/5] net/mlx5: support flow dump API Xiaoyu Min
2020-01-17 11:56 ` [dpdk-dev] [PATCH v2 3/5] app/testpmd: new flow dump CLI Xiaoyu Min
2020-01-17 11:56 ` [dpdk-dev] [PATCH v2 4/5] net/mlx5: add socket server for external tools Xiaoyu Min
2020-01-17 11:56 ` [dpdk-dev] [PATCH v2 5/5] doc: update mlx5 document for flow dump feature Xiaoyu Min
2020-01-17 19:26 ` [dpdk-dev] [PATCH v2 0/5] ethdev: add API to dump device internal flow info Ferruh Yigit
2020-01-19 21:08 ` Thomas Monjalon
2020-01-20 1:40 ` Jack Min
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87ca94513977186064949d272c5785597f664d20.1579168182.git.jackmin@mellanox.com \
--to=jackmin@mellanox.com \
--cc=dev@dpdk.org \
--cc=jerinjacobk@gmail.com \
--cc=matan@mellanox.com \
--cc=orika@mellanox.com \
--cc=rasland@mellanox.com \
--cc=shahafs@mellanox.com \
--cc=viacheslavo@mellanox.com \
--cc=xuemingl@mellanox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).