From patchwork Thu Apr 15 11:19:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Haifei Luo X-Patchwork-Id: 91570 X-Patchwork-Delegate: rasland@nvidia.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 72163A0C3F; Thu, 15 Apr 2021 13:19:40 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BC3E7161ECF; Thu, 15 Apr 2021 13:19:35 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id 0B120161EA1 for ; Thu, 15 Apr 2021 13:19:32 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from haifeil@nvidia.com) with SMTP; 15 Apr 2021 14:19:27 +0300 Received: from nvidia.com (gen-l-vrt-173.mtl.labs.mlnx [10.234.173.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 13FBJR8g024937; Thu, 15 Apr 2021 14:19:27 +0300 From: Haifei Luo To: dev@dpdk.org Cc: orika@nvidia.com, viacheslavo@nvidia.com, rasland@nvidia.com, xuemingl@nvidia.com, haifeil@nvidia.com, Matan Azrad , Shahaf Shuler , Ray Kinsella , Neil Horman Date: Thu, 15 Apr 2021 14:19:23 +0300 Message-Id: <1618485564-128533-2-git-send-email-haifeil@nvidia.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1618485564-128533-1-git-send-email-haifeil@nvidia.com> References: <1618384952-179763-1-git-send-email-haifeil@nvidia.com> <1618485564-128533-1-git-send-email-haifeil@nvidia.com> Subject: [dpdk-dev] [PATCH v3 1/2] common/mlx5: add mlx5 APIs for single flow dump feature X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" add mlx5 APIs for single flow dump feature Signed-off-by: Haifei Luo Acked-by: Viacheslav Ovsiienko --- drivers/common/mlx5/linux/meson.build | 6 ++++-- drivers/common/mlx5/linux/mlx5_glue.c | 13 +++++++++++++ drivers/common/mlx5/linux/mlx5_glue.h | 1 + drivers/common/mlx5/mlx5_devx_cmds.c | 14 ++++++++++++++ drivers/common/mlx5/mlx5_devx_cmds.h | 2 ++ drivers/common/mlx5/version.map | 1 + 6 files changed, 35 insertions(+), 2 deletions(-) diff --git a/drivers/common/mlx5/linux/meson.build b/drivers/common/mlx5/linux/meson.build index 5d6a861..e8fcbd9 100644 --- a/drivers/common/mlx5/linux/meson.build +++ b/drivers/common/mlx5/linux/meson.build @@ -186,8 +186,10 @@ has_sym_args = [ 'mlx5dv_dr_action_create_aso' ], [ 'HAVE_INFINIBAND_VERBS_H', 'infiniband/verbs.h', 'INFINIBAND_VERBS_H' ], - [ 'HAVE_MLX5_UMR_IMKEY', 'infiniband/mlx5dv.h', - 'MLX5_WQE_UMR_CTRL_FLAG_INLINE' ], + [ 'HAVE_MLX5_UMR_IMKEY', 'infiniband/mlx5dv.h', + 'MLX5_WQE_UMR_CTRL_FLAG_INLINE' ], + [ 'HAVE_MLX5_DR_FLOW_DUMP_RULE', 'infiniband/mlx5dv.h', + 'mlx5dv_dump_dr_rule' ], ] config = configuration_data() foreach arg:has_sym_args diff --git a/drivers/common/mlx5/linux/mlx5_glue.c b/drivers/common/mlx5/linux/mlx5_glue.c index 964f7e7..d3bd645 100644 --- a/drivers/common/mlx5/linux/mlx5_glue.c +++ b/drivers/common/mlx5/linux/mlx5_glue.c @@ -1101,6 +1101,18 @@ } static int +mlx5_glue_dr_dump_single_rule(FILE *file, void *rule) +{ +#ifdef HAVE_MLX5_DR_FLOW_DUMP_RULE + return mlx5dv_dump_dr_rule(file, rule); +#else + RTE_SET_USED(file); + RTE_SET_USED(rule); + return -ENOTSUP; +#endif +} + +static int mlx5_glue_dr_dump_domain(FILE *file, void *domain) { #ifdef HAVE_MLX5_DR_FLOW_DUMP @@ -1423,6 +1435,7 @@ .devx_wq_query = mlx5_glue_devx_wq_query, .devx_port_query = mlx5_glue_devx_port_query, .dr_dump_domain = mlx5_glue_dr_dump_domain, + .dr_dump_rule = mlx5_glue_dr_dump_single_rule, .dr_reclaim_domain_memory = mlx5_glue_dr_reclaim_domain_memory, .dr_create_flow_action_sampler = mlx5_glue_dr_create_flow_action_sampler, diff --git a/drivers/common/mlx5/linux/mlx5_glue.h b/drivers/common/mlx5/linux/mlx5_glue.h index 9e385be..97462e9 100644 --- a/drivers/common/mlx5/linux/mlx5_glue.h +++ b/drivers/common/mlx5/linux/mlx5_glue.h @@ -313,6 +313,7 @@ struct mlx5_glue { uint32_t port_num, struct mlx5dv_devx_port *mlx5_devx_port); int (*dr_dump_domain)(FILE *file, void *domain); + int (*dr_dump_rule)(FILE *file, void *rule); int (*devx_query_eqn)(struct ibv_context *context, uint32_t cpus, uint32_t *eqn); struct mlx5dv_devx_event_channel *(*devx_create_event_channel) diff --git a/drivers/common/mlx5/mlx5_devx_cmds.c b/drivers/common/mlx5/mlx5_devx_cmds.c index 268bcd0..ec6069b 100644 --- a/drivers/common/mlx5/mlx5_devx_cmds.c +++ b/drivers/common/mlx5/mlx5_devx_cmds.c @@ -1584,6 +1584,20 @@ struct mlx5_devx_obj * return -ret; } +int +mlx5_devx_cmd_flow_single_dump(void *rule_info __rte_unused, + FILE *file __rte_unused) +{ + int ret = 0; +#ifdef HAVE_MLX5_DR_FLOW_DUMP_RULE + if (rule_info) + ret = mlx5_glue->dr_dump_rule(file, rule_info); +#else + ret = ENOTSUP; +#endif + return -ret; +} + /* * Create CQ using DevX API. * diff --git a/drivers/common/mlx5/mlx5_devx_cmds.h b/drivers/common/mlx5/mlx5_devx_cmds.h index 67b5f77..209e7da 100644 --- a/drivers/common/mlx5/mlx5_devx_cmds.h +++ b/drivers/common/mlx5/mlx5_devx_cmds.h @@ -477,6 +477,8 @@ struct mlx5_devx_obj *mlx5_devx_cmd_create_tis(void *ctx, int mlx5_devx_cmd_flow_dump(void *fdb_domain, void *rx_domain, void *tx_domain, FILE *file); __rte_internal +int mlx5_devx_cmd_flow_single_dump(void *rule, FILE *file); +__rte_internal struct mlx5_devx_obj *mlx5_devx_cmd_create_cq(void *ctx, struct mlx5_devx_cq_attr *attr); __rte_internal diff --git a/drivers/common/mlx5/version.map b/drivers/common/mlx5/version.map index 8b196a4..d2037bd 100644 --- a/drivers/common/mlx5/version.map +++ b/drivers/common/mlx5/version.map @@ -30,6 +30,7 @@ INTERNAL { mlx5_devx_cmd_flow_counter_alloc; mlx5_devx_cmd_flow_counter_query; mlx5_devx_cmd_flow_dump; + mlx5_devx_cmd_flow_single_dump; mlx5_devx_cmd_mkey_create; mlx5_devx_cmd_modify_qp_state; mlx5_devx_cmd_modify_rq; From patchwork Thu Apr 15 11:19:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Haifei Luo X-Patchwork-Id: 91569 X-Patchwork-Delegate: rasland@nvidia.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 08E40A0C3F; Thu, 15 Apr 2021 13:19:35 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 90756161EA1; Thu, 15 Apr 2021 13:19:34 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id 064EE161E9B for ; Thu, 15 Apr 2021 13:19:32 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from haifeil@nvidia.com) with SMTP; 15 Apr 2021 14:19:27 +0300 Received: from nvidia.com (gen-l-vrt-173.mtl.labs.mlnx [10.234.173.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 13FBJR8h024937; Thu, 15 Apr 2021 14:19:27 +0300 From: Haifei Luo To: dev@dpdk.org Cc: orika@nvidia.com, viacheslavo@nvidia.com, rasland@nvidia.com, xuemingl@nvidia.com, haifeil@nvidia.com, Matan Azrad , Shahaf Shuler Date: Thu, 15 Apr 2021 14:19:24 +0300 Message-Id: <1618485564-128533-3-git-send-email-haifeil@nvidia.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1618485564-128533-1-git-send-email-haifeil@nvidia.com> References: <1618384952-179763-1-git-send-email-haifeil@nvidia.com> <1618485564-128533-1-git-send-email-haifeil@nvidia.com> Subject: [dpdk-dev] [PATCH v3 2/2] net/mlx5: add mlx5 APIs for single flow dump feature X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" Modify API mlx5_flow_dev_dump to support the feature. Modify mlx5_socket since one extra arg flow_ptr is added. The data structure sent to DPDK application from the utility triggering the flow dumps should be packed and endianness must be specified. The native host endianness can be used, all exchange happens within the same host (we use sendmsg aux data and share the file handle, remote approach is not applicable, no inter-host communication happens). The message structure to dump one/all flow(s): struct mlx5_flow_dump_req { uint32_t port_id; uint64_t flow_ptr; } __rte_packed; If flow_ptr is 0, all flows for the specified port will be dumped. Signed-off-by: Haifei Luo Acked-by: Viacheslav Ovsiienko --- drivers/net/mlx5/linux/mlx5_os.h | 3 +++ drivers/net/mlx5/linux/mlx5_socket.c | 47 ++++++++++++++++++++++++++++-------- drivers/net/mlx5/mlx5.h | 10 ++++++++ drivers/net/mlx5/mlx5_flow.c | 30 +++++++++++++++++++++-- 4 files changed, 78 insertions(+), 12 deletions(-) diff --git a/drivers/net/mlx5/linux/mlx5_os.h b/drivers/net/mlx5/linux/mlx5_os.h index 6100a13..4ae7d0e 100644 --- a/drivers/net/mlx5/linux/mlx5_os.h +++ b/drivers/net/mlx5/linux/mlx5_os.h @@ -14,6 +14,9 @@ enum { MLX5_FS_PATH_MAX = IBV_SYSFS_PATH_MAX + 1 }; +/* Maximal data of sendmsg message(in bytes). */ +#define MLX5_SENDMSG_MAX 64 + #define MLX5_NAMESIZE IF_NAMESIZE #define PCI_DRV_FLAGS (RTE_PCI_DRV_INTR_LSC | \ diff --git a/drivers/net/mlx5/linux/mlx5_socket.c b/drivers/net/mlx5/linux/mlx5_socket.c index 6e354f4..6356b66 100644 --- a/drivers/net/mlx5/linux/mlx5_socket.c +++ b/drivers/net/mlx5/linux/mlx5_socket.c @@ -2,6 +2,10 @@ * Copyright 2019 Mellanox Technologies, Ltd */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + #include #include #include @@ -30,10 +34,11 @@ int conn_sock; int ret; struct cmsghdr *cmsg = NULL; - int data; - char buf[CMSG_SPACE(sizeof(int))] = { 0 }; + uint32_t data[MLX5_SENDMSG_MAX / sizeof(uint32_t)]; + uint64_t flow_ptr = 0; + uint8_t buf[CMSG_SPACE(sizeof(int))] = { 0 }; struct iovec io = { - .iov_base = &data, + .iov_base = data, .iov_len = sizeof(data), }; struct msghdr msg = { @@ -42,11 +47,16 @@ .msg_control = buf, .msg_controllen = sizeof(buf), }; - uint16_t port_id; + + uint32_t port_id; int fd; FILE *file = NULL; struct rte_eth_dev *dev; + struct rte_flow_error err; + struct mlx5_flow_dump_req *dump_req; + struct mlx5_flow_dump_ack *dump_ack; + memset(data, 0, sizeof(data)); /* Accept the connection from the client. */ conn_sock = accept(server_socket, NULL, NULL); if (conn_sock < 0) { @@ -54,11 +64,12 @@ return; } ret = recvmsg(conn_sock, &msg, MSG_WAITALL); - if (ret < 0) { + if (ret != sizeof(struct mlx5_flow_dump_req)) { DRV_LOG(WARNING, "wrong message received: %s", strerror(errno)); goto error; } + /* Receive file descriptor. */ cmsg = CMSG_FIRSTHDR(&msg); if (cmsg == NULL || cmsg->cmsg_type != SCM_RIGHTS || @@ -77,22 +88,38 @@ DRV_LOG(WARNING, "wrong port number message"); goto error; } - memcpy(&port_id, msg.msg_iov->iov_base, sizeof(port_id)); + + dump_req = (struct mlx5_flow_dump_req *)msg.msg_iov->iov_base; + if (dump_req) { + port_id = dump_req->port_id; + flow_ptr = dump_req->flow_id; + } else { + DRV_LOG(WARNING, "Invalid message"); + goto error; + } + if (!rte_eth_dev_is_valid_port(port_id)) { DRV_LOG(WARNING, "Invalid port %u", port_id); goto error; } + /* Dump flow. */ dev = &rte_eth_devices[port_id]; - ret = mlx5_flow_dev_dump(dev, NULL, file, NULL); + if (flow_ptr == 0) + ret = mlx5_flow_dev_dump(dev, NULL, file, NULL); + else + ret = mlx5_flow_dev_dump(dev, + (struct rte_flow *)((uintptr_t)flow_ptr), file, &err); + /* Set-up the ancillary data and reply. */ msg.msg_controllen = 0; msg.msg_control = NULL; msg.msg_iovlen = 1; msg.msg_iov = &io; - data = -ret; - io.iov_len = sizeof(data); - io.iov_base = &data; + dump_ack = (struct mlx5_flow_dump_ack *)data; + dump_ack->rc = -ret; + io.iov_len = sizeof(struct mlx5_flow_dump_ack); + io.iov_base = dump_ack; do { ret = sendmsg(conn_sock, &msg, 0); } while (ret < 0 && errno == EINTR); diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index e0f7101..452c5de 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -118,6 +118,16 @@ struct mlx5_dev_spawn_data { struct mlx5_bond_info *bond_info; }; +/** Data associated with socket messages. */ +struct mlx5_flow_dump_req { + uint32_t port_id; /**< There are plans in DPDK to extend port_id. */ + uint64_t flow_id; +} __rte_packed; + +struct mlx5_flow_dump_ack { + int rc; /**< Return code. */ +}; + /** Key string for IPC. */ #define MLX5_MP_NAME "net_mlx5_mp" diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index 8446307..ff40406 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -7161,6 +7161,10 @@ struct mlx5_meter_domains_infos * { struct mlx5_priv *priv = dev->data->dev_private; struct mlx5_dev_ctx_shared *sh = priv->sh; + uint32_t handle_idx; + int ret; + struct mlx5_flow_handle *dh; + struct rte_flow *flow; if (!priv->config.dv_flow_en) { if (fputs("device dv flow disabled\n", file) <= 0) @@ -7168,10 +7172,32 @@ struct mlx5_meter_domains_infos * return -ENOTSUP; } + /* dump all */ if (!flow_idx) return mlx5_devx_cmd_flow_dump(sh->fdb_domain, - sh->rx_domain, sh->tx_domain, file); - return -ENOTSUP; + sh->rx_domain, + sh->tx_domain, file); + /* dump one */ + flow = mlx5_ipool_get(priv->sh->ipool + [MLX5_IPOOL_RTE_FLOW], (uintptr_t)(void *)flow_idx); + if (!flow) + return -ENOENT; + + handle_idx = flow->dev_handles; + while (handle_idx) { + dh = mlx5_ipool_get(priv->sh->ipool[MLX5_IPOOL_MLX5_FLOW], + handle_idx); + if (!dh) + return -ENOENT; + if (dh->drv_flow) { + ret = mlx5_devx_cmd_flow_single_dump(dh->drv_flow, + file); + if (ret) + return -ENOENT; + } + handle_idx = dh->next.next; + } + return 0; } /**