get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/91569/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 91569,
    "url": "https://patches.dpdk.org/api/patches/91569/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1618485564-128533-3-git-send-email-haifeil@nvidia.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1618485564-128533-3-git-send-email-haifeil@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1618485564-128533-3-git-send-email-haifeil@nvidia.com",
    "date": "2021-04-15T11:19:24",
    "name": "[v3,2/2] net/mlx5: add mlx5 APIs for single flow dump feature",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "87654ad9a57add5a0d88639d37a2b799702c4a5b",
    "submitter": {
        "id": 2131,
        "url": "https://patches.dpdk.org/api/people/2131/?format=api",
        "name": "Haifei Luo",
        "email": "haifeil@nvidia.com"
    },
    "delegate": {
        "id": 3268,
        "url": "https://patches.dpdk.org/api/users/3268/?format=api",
        "username": "rasland",
        "first_name": "Raslan",
        "last_name": "Darawsheh",
        "email": "rasland@nvidia.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1618485564-128533-3-git-send-email-haifeil@nvidia.com/mbox/",
    "series": [
        {
            "id": 16411,
            "url": "https://patches.dpdk.org/api/series/16411/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=16411",
            "date": "2021-04-15T11:19:22",
            "name": "support single flow dump on MLX5 PMD",
            "version": 3,
            "mbox": "https://patches.dpdk.org/series/16411/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/91569/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/91569/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "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])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 08E40A0C3F;\n\tThu, 15 Apr 2021 13:19:35 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 90756161EA1;\n\tThu, 15 Apr 2021 13:19:34 +0200 (CEST)",
            "from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129])\n by mails.dpdk.org (Postfix) with ESMTP id 064EE161E9B\n for <dev@dpdk.org>; Thu, 15 Apr 2021 13:19:32 +0200 (CEST)",
            "from Internal Mail-Server by MTLPINE1 (envelope-from\n haifeil@nvidia.com) with SMTP; 15 Apr 2021 14:19:27 +0300",
            "from nvidia.com (gen-l-vrt-173.mtl.labs.mlnx [10.234.173.1])\n by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 13FBJR8h024937;\n Thu, 15 Apr 2021 14:19:27 +0300"
        ],
        "From": "Haifei Luo <haifeil@nvidia.com>",
        "To": "dev@dpdk.org",
        "Cc": "orika@nvidia.com, viacheslavo@nvidia.com, rasland@nvidia.com,\n xuemingl@nvidia.com, haifeil@nvidia.com,\n Matan Azrad <matan@nvidia.com>, Shahaf Shuler <shahafs@nvidia.com>",
        "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>\n <1618485564-128533-1-git-send-email-haifeil@nvidia.com>",
        "Subject": "[dpdk-dev] [PATCH v3 2/2] net/mlx5: add mlx5 APIs for single flow\n dump feature",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Modify API mlx5_flow_dev_dump to support the feature.\nModify mlx5_socket since one extra arg flow_ptr is added.\n\nThe data structure sent to DPDK application from the utility triggering\nthe flow dumps should be packed and endianness must be specified.\nThe native host endianness can be used, all exchange happens within\nthe same host (we use sendmsg aux data and share the file handle,\nremote approach is not applicable, no inter-host communication happens).\n\nThe message structure to dump one/all flow(s):\nstruct mlx5_flow_dump_req {\n\tuint32_t port_id;\n\tuint64_t flow_ptr;\n} __rte_packed;\n\nIf flow_ptr is 0, all flows for the specified port will be dumped.\n\nSigned-off-by: Haifei Luo <haifeil@nvidia.com>\n---\n drivers/net/mlx5/linux/mlx5_os.h     |  3 +++\n drivers/net/mlx5/linux/mlx5_socket.c | 47 ++++++++++++++++++++++++++++--------\n drivers/net/mlx5/mlx5.h              | 10 ++++++++\n drivers/net/mlx5/mlx5_flow.c         | 30 +++++++++++++++++++++--\n 4 files changed, 78 insertions(+), 12 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/linux/mlx5_os.h b/drivers/net/mlx5/linux/mlx5_os.h\nindex 6100a13..4ae7d0e 100644\n--- a/drivers/net/mlx5/linux/mlx5_os.h\n+++ b/drivers/net/mlx5/linux/mlx5_os.h\n@@ -14,6 +14,9 @@ enum {\n \tMLX5_FS_PATH_MAX = IBV_SYSFS_PATH_MAX + 1\n };\n \n+/* Maximal data of sendmsg message(in bytes). */\n+#define MLX5_SENDMSG_MAX 64\n+\n #define MLX5_NAMESIZE IF_NAMESIZE\n \n #define PCI_DRV_FLAGS  (RTE_PCI_DRV_INTR_LSC | \\\ndiff --git a/drivers/net/mlx5/linux/mlx5_socket.c b/drivers/net/mlx5/linux/mlx5_socket.c\nindex 6e354f4..6356b66 100644\n--- a/drivers/net/mlx5/linux/mlx5_socket.c\n+++ b/drivers/net/mlx5/linux/mlx5_socket.c\n@@ -2,6 +2,10 @@\n  * Copyright 2019 Mellanox Technologies, Ltd\n  */\n \n+#ifndef _GNU_SOURCE\n+#define _GNU_SOURCE\n+#endif\n+\n #include <sys/types.h>\n #include <sys/socket.h>\n #include <sys/un.h>\n@@ -30,10 +34,11 @@\n \tint conn_sock;\n \tint ret;\n \tstruct cmsghdr *cmsg = NULL;\n-\tint data;\n-\tchar buf[CMSG_SPACE(sizeof(int))] = { 0 };\n+\tuint32_t data[MLX5_SENDMSG_MAX / sizeof(uint32_t)];\n+\tuint64_t flow_ptr = 0;\n+\tuint8_t  buf[CMSG_SPACE(sizeof(int))] = { 0 };\n \tstruct iovec io = {\n-\t\t.iov_base = &data,\n+\t\t.iov_base = data,\n \t\t.iov_len = sizeof(data),\n \t};\n \tstruct msghdr msg = {\n@@ -42,11 +47,16 @@\n \t\t.msg_control = buf,\n \t\t.msg_controllen = sizeof(buf),\n \t};\n-\tuint16_t port_id;\n+\n+\tuint32_t port_id;\n \tint fd;\n \tFILE *file = NULL;\n \tstruct rte_eth_dev *dev;\n+\tstruct rte_flow_error err;\n+\tstruct mlx5_flow_dump_req  *dump_req;\n+\tstruct mlx5_flow_dump_ack  *dump_ack;\n \n+\tmemset(data, 0, sizeof(data));\n \t/* Accept the connection from the client. */\n \tconn_sock = accept(server_socket, NULL, NULL);\n \tif (conn_sock < 0) {\n@@ -54,11 +64,12 @@\n \t\treturn;\n \t}\n \tret = recvmsg(conn_sock, &msg, MSG_WAITALL);\n-\tif (ret < 0) {\n+\tif (ret != sizeof(struct mlx5_flow_dump_req)) {\n \t\tDRV_LOG(WARNING, \"wrong message received: %s\",\n \t\t\tstrerror(errno));\n \t\tgoto error;\n \t}\n+\n \t/* Receive file descriptor. */\n \tcmsg = CMSG_FIRSTHDR(&msg);\n \tif (cmsg == NULL || cmsg->cmsg_type != SCM_RIGHTS ||\n@@ -77,22 +88,38 @@\n \t\tDRV_LOG(WARNING, \"wrong port number message\");\n \t\tgoto error;\n \t}\n-\tmemcpy(&port_id, msg.msg_iov->iov_base, sizeof(port_id));\n+\n+\tdump_req = (struct mlx5_flow_dump_req *)msg.msg_iov->iov_base;\n+\tif (dump_req) {\n+\t\tport_id = dump_req->port_id;\n+\t\tflow_ptr = dump_req->flow_id;\n+\t} else {\n+\t\tDRV_LOG(WARNING, \"Invalid message\");\n+\t\tgoto error;\n+\t}\n+\n \tif (!rte_eth_dev_is_valid_port(port_id)) {\n \t\tDRV_LOG(WARNING, \"Invalid port %u\", port_id);\n \t\tgoto error;\n \t}\n+\n \t/* Dump flow. */\n \tdev = &rte_eth_devices[port_id];\n-\tret = mlx5_flow_dev_dump(dev, NULL, file, NULL);\n+\tif (flow_ptr == 0)\n+\t\tret = mlx5_flow_dev_dump(dev, NULL, file, NULL);\n+\telse\n+\t\tret = mlx5_flow_dev_dump(dev,\n+\t\t\t(struct rte_flow *)((uintptr_t)flow_ptr), file, &err);\n+\n \t/* Set-up the ancillary data and reply. */\n \tmsg.msg_controllen = 0;\n \tmsg.msg_control = NULL;\n \tmsg.msg_iovlen = 1;\n \tmsg.msg_iov = &io;\n-\tdata = -ret;\n-\tio.iov_len = sizeof(data);\n-\tio.iov_base = &data;\n+\tdump_ack = (struct mlx5_flow_dump_ack *)data;\n+\tdump_ack->rc = -ret;\n+\tio.iov_len = sizeof(struct mlx5_flow_dump_ack);\n+\tio.iov_base = dump_ack;\n \tdo {\n \t\tret = sendmsg(conn_sock, &msg, 0);\n \t} while (ret < 0 && errno == EINTR);\ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex e0f7101..452c5de 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -118,6 +118,16 @@ struct mlx5_dev_spawn_data {\n \tstruct mlx5_bond_info *bond_info;\n };\n \n+/** Data associated with socket messages. */\n+struct mlx5_flow_dump_req  {\n+\tuint32_t port_id; /**< There are plans in DPDK to extend port_id. */\n+\tuint64_t flow_id;\n+} __rte_packed;\n+\n+struct mlx5_flow_dump_ack {\n+\tint rc; /**< Return code. */\n+};\n+\n /** Key string for IPC. */\n #define MLX5_MP_NAME \"net_mlx5_mp\"\n \ndiff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c\nindex 8446307..ff40406 100644\n--- a/drivers/net/mlx5/mlx5_flow.c\n+++ b/drivers/net/mlx5/mlx5_flow.c\n@@ -7161,6 +7161,10 @@ struct mlx5_meter_domains_infos *\n {\n \tstruct mlx5_priv *priv = dev->data->dev_private;\n \tstruct mlx5_dev_ctx_shared *sh = priv->sh;\n+\tuint32_t handle_idx;\n+\tint ret;\n+\tstruct mlx5_flow_handle *dh;\n+\tstruct rte_flow *flow;\n \n \tif (!priv->config.dv_flow_en) {\n \t\tif (fputs(\"device dv flow disabled\\n\", file) <= 0)\n@@ -7168,10 +7172,32 @@ struct mlx5_meter_domains_infos *\n \t\treturn -ENOTSUP;\n \t}\n \n+\t/* dump all */\n \tif (!flow_idx)\n \t\treturn mlx5_devx_cmd_flow_dump(sh->fdb_domain,\n-\t\t\t\tsh->rx_domain, sh->tx_domain, file);\n-\treturn -ENOTSUP;\n+\t\t\t\t\tsh->rx_domain,\n+\t\t\t\t\tsh->tx_domain, file);\n+\t/* dump one */\n+\tflow = mlx5_ipool_get(priv->sh->ipool\n+\t\t\t[MLX5_IPOOL_RTE_FLOW], (uintptr_t)(void *)flow_idx);\n+\tif (!flow)\n+\t\treturn -ENOENT;\n+\n+\thandle_idx = flow->dev_handles;\n+\twhile (handle_idx) {\n+\t\tdh = mlx5_ipool_get(priv->sh->ipool[MLX5_IPOOL_MLX5_FLOW],\n+\t\t\t\thandle_idx);\n+\t\tif (!dh)\n+\t\t\treturn -ENOENT;\n+\t\tif (dh->drv_flow) {\n+\t\t\tret = mlx5_devx_cmd_flow_single_dump(dh->drv_flow,\n+\t\t\t\t\tfile);\n+\t\t\tif (ret)\n+\t\t\t\treturn -ENOENT;\n+\t\t}\n+\t\thandle_idx = dh->next.next;\n+\t}\n+\treturn 0;\n }\n \n /**\n",
    "prefixes": [
        "v3",
        "2/2"
    ]
}