From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9D04FA04FD; Tue, 14 Jan 2020 04:45:38 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 4FCB41C2EB; Tue, 14 Jan 2020 04:45:38 +0100 (CET) Received: from git-send-mailer.rdmz.labs.mlnx (unknown [37.142.13.130]) by dpdk.org (Postfix) with ESMTP id CDAC31C2E8 for ; Tue, 14 Jan 2020 04:45:36 +0100 (CET) From: Xiaoyu Min To: viacheslavo@mellanox.com, matan@mellanox.com, rasland@mellanox.com, Shahaf Shuler Cc: dev@dpdk.org, Xueming Li Date: Tue, 14 Jan 2020 05:45:12 +0200 Message-Id: <056af6ddbd8c47622ff5221d6315e653b2a2dceb.1578969179.git.jackmin@mellanox.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [RFC 1/4] net/mlx5: support flow dump Api X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Xueming Li Dump fdb/nic_rx/nic_tx raw flow data into specified file. Signed-off-by: Xueming Li Signed-off-by: Xiaoyu Min --- drivers/net/mlx5/Makefile | 11 ++++++- drivers/net/mlx5/meson.build | 4 +++ drivers/net/mlx5/mlx5.h | 2 ++ drivers/net/mlx5/mlx5_devx_cmds.c | 35 ++++++++++++++++++++ drivers/net/mlx5/mlx5_glue.c | 13 ++++++++ drivers/net/mlx5/mlx5_glue.h | 1 + drivers/net/mlx5/rte_pmd_mlx5.c | 22 +++++++++++++ drivers/net/mlx5/rte_pmd_mlx5.h | 39 +++++++++++++++++++++++ drivers/net/mlx5/rte_pmd_mlx5_version.map | 7 ++++ 9 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 drivers/net/mlx5/rte_pmd_mlx5.c create mode 100644 drivers/net/mlx5/rte_pmd_mlx5.h diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile index c5cf4397ac..0ff907445e 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 @@ -39,6 +39,10 @@ SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_mp.c SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_nl.c SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_devx_cmds.c SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_utils.c +SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += rte_pmd_mlx5.c + +# Export include files of private API. +SYMLINK-$(CONFIG_RTE_LIBRTE_MLX5_PMD)-include += rte_pmd_mlx5.h ifeq ($(CONFIG_RTE_IBVERBS_LINK_DLOPEN),y) INSTALL-$(CONFIG_RTE_LIBRTE_MLX5_PMD)-lib += $(LIB_GLUE) @@ -203,6 +207,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..1bdebcb6fc 100644 --- a/drivers/net/mlx5/meson.build +++ b/drivers/net/mlx5/meson.build @@ -61,6 +61,7 @@ if build 'mlx5_vlan.c', 'mlx5_devx_cmds.c', 'mlx5_utils.c', + 'rte_pmd_mlx5.c', ) if (dpdk_conf.has('RTE_ARCH_X86_64') or dpdk_conf.has('RTE_ARCH_ARM64') @@ -186,6 +187,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 @@ -225,3 +228,4 @@ if pmd_dlopen and build install_dir: dlopen_install_dir, ) endif +install_headers('rte_pmd_mlx5.h') diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index c3df8256ce..68b08a7f0b 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -1049,6 +1049,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_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; diff --git a/drivers/net/mlx5/rte_pmd_mlx5.c b/drivers/net/mlx5/rte_pmd_mlx5.c new file mode 100644 index 0000000000..18fa12161a --- /dev/null +++ b/drivers/net/mlx5/rte_pmd_mlx5.c @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: BSD-3-Clause +/* + * Copyright 2019 Mellanox Technologies, Ltd + */ + +#include +#include + +#include "rte_pmd_mlx5.h" +#include "mlx5.h" + +int +rte_pmd_mlx5_flow_dump(uint16_t port_id, FILE *file) +{ + struct rte_eth_dev *dev; + struct mlx5_priv *priv; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL); + dev = &rte_eth_devices[port_id]; + priv = dev->data->dev_private; + return mlx5_devx_cmd_flow_dump(priv->sh, file); +} diff --git a/drivers/net/mlx5/rte_pmd_mlx5.h b/drivers/net/mlx5/rte_pmd_mlx5.h new file mode 100644 index 0000000000..f92a054541 --- /dev/null +++ b/drivers/net/mlx5/rte_pmd_mlx5.h @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ +/* + * Copyright 2019 Mellanox Technologies, Ltd + */ + +#ifndef _RTE_PMD_MLX5_H_ +#define _RTE_PMD_MLX5_H_ + +/** + * @file + * + * Mellanox private RTE level APIs. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Dump flow raw data to file + * + * @param port_id + * The port identifier of the Ethernet device. + * @param file + * The index of the transmit queue which want to query. + * @return + * 0 on success, a nagative value otherwise. + */ +__rte_experimental +int +rte_pmd_mlx5_flow_dump(uint16_t port_id, FILE *file); + +#ifdef __cplusplus +} +#endif +#endif /* _RTE_PMD_MLX5_H_ */ diff --git a/drivers/net/mlx5/rte_pmd_mlx5_version.map b/drivers/net/mlx5/rte_pmd_mlx5_version.map index f9f17e4f6e..c7b70201d8 100644 --- a/drivers/net/mlx5/rte_pmd_mlx5_version.map +++ b/drivers/net/mlx5/rte_pmd_mlx5_version.map @@ -1,3 +1,10 @@ DPDK_20.0 { local: *; }; + +EXPERIMENTAL { + global: + + rte_pmd_mlx5_flow_dump; + +}; -- 2.24.1