get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 96467,
    "url": "https://patches.dpdk.org/api/patches/96467/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210730135533.417611-8-thomas@monjalon.net/",
    "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": "<20210730135533.417611-8-thomas@monjalon.net>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210730135533.417611-8-thomas@monjalon.net",
    "date": "2021-07-30T13:55:33",
    "name": "[RFC,v2,7/7] hcdev: add communication list",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "14f3fe1e55eb049db255b8b3f00f553ebd306fdf",
    "submitter": {
        "id": 685,
        "url": "https://patches.dpdk.org/api/people/685/?format=api",
        "name": "Thomas Monjalon",
        "email": "thomas@monjalon.net"
    },
    "delegate": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210730135533.417611-8-thomas@monjalon.net/mbox/",
    "series": [
        {
            "id": 18101,
            "url": "https://patches.dpdk.org/api/series/18101/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=18101",
            "date": "2021-07-30T13:55:26",
            "name": "heterogeneous computing library",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/18101/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/96467/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/96467/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 F29F5A0A0C;\n\tFri, 30 Jul 2021 15:56:45 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id D9A9A410F6;\n\tFri, 30 Jul 2021 15:56:44 +0200 (CEST)",
            "from out1-smtp.messagingengine.com (out1-smtp.messagingengine.com\n [66.111.4.25]) by mails.dpdk.org (Postfix) with ESMTP id 09545410F6\n for <dev@dpdk.org>; Fri, 30 Jul 2021 15:56:43 +0200 (CEST)",
            "from compute4.internal (compute4.nyi.internal [10.202.2.44])\n by mailout.nyi.internal (Postfix) with ESMTP id B3E535C00C4;\n Fri, 30 Jul 2021 09:56:42 -0400 (EDT)",
            "from mailfrontend1 ([10.202.2.162])\n by compute4.internal (MEProxy); Fri, 30 Jul 2021 09:56:42 -0400",
            "by mail.messagingengine.com (Postfix) with ESMTPA; Fri,\n 30 Jul 2021 09:56:41 -0400 (EDT)"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h=\n from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding; s=fm1; bh=IKiqbwgmKuSIp\n Q9974aAn+RBnCawfSH9+cCtgcvEvM0=; b=3NiDBVumJDBoR5SG+sUE0P3o0lSj+\n 9rPjBmsvH88ZDYjqWQGBa821VTPnd/K2jgS33VANDcDDznziXMClB5ATDUcCYMZE\n SudhvZZvrfx8oSJXb06p55YIYTTaIfnwteCOQK60zcDOkpLi/MU2XmAEF8h1Y3Po\n vO1/zzAvZ+1JVDFXBmPYFtTq310Y7oJ+hYV/0xMeervrLOE38gPrVOVhjQS6iFUM\n BkUIszCvcB+g/Fmy143pA+0JEH4OCAGIiTV4IY2UL0oAaEtS7piau1f3jhvRcALK\n x3Q3fyu8pyhQ/tMGSDuE0m+5h356JMpJv3dVWClbnLmlYCNaB4T9xDyHQ==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=\n messagingengine.com; h=cc:content-transfer-encoding:date:from\n :in-reply-to:message-id:mime-version:references:subject:to\n :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=\n fm3; bh=IKiqbwgmKuSIpQ9974aAn+RBnCawfSH9+cCtgcvEvM0=; b=bYfdTUe1\n 0x8t/i0aGUlg90IFvl3eoe4H3F66pOj8WbtwagjcHLrn8uuExOlKwyxb20mtI1Wr\n qHF7Pf+xC4MBD+YxXKYxJ8arnWa2feHmToRIAtjoQ4eSwgv50FFRdbaBTaqYrFMM\n CvInRTus5QYZbM3C6K1PZrC32dphEbx/QDESfVzID/EG5xI7awRlNAIQ7FOPxSKt\n kRmPBTbIqCNg7uWRWAbLZYaxn3osyB3RPylImI+hN3b7yw6QRid/kENOLMqypLSm\n K9PKrSGF2vFPJ5xEnHEf/F8fz1hSZY+E5MO8NsLFdVXPYaD+8wARUdlqU405KOoA\n k4b4nLD8cmDo5A=="
        ],
        "X-ME-Sender": "<xms:GgUEYTa5q2r8Vw5mlh7f0mLui3sXrjKC7dt5DXlG1XP-LdK_Zl3I8g>\n <xme:GgUEYSZ8Qo0378e-SGzMnHdMXYbMusN5xC4YqqbmeTCXudW_IP_U6CQLuYtnjejiA\n _qN6yAHp12VtdUc4A>",
        "X-ME-Received": "\n <xmr:GgUEYV9YQT9ktt1TJWt2Qu9S5_1jcH0OwSSoErKQjTNxfMB95AkyjBpcKh_FxfpbASQzBuZh2PyM-Auix7_Olm6lZ52k6-4>",
        "X-ME-Proxy-Cause": "\n gggruggvucftvghtrhhoucdtuddrgedvtddrheehgdeiiecutefuodetggdotefrodftvf\n curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu\n uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc\n fjughrpefhvffufffkofgjfhgggfestdekredtredttdenucfhrhhomhepvfhhohhmrghs\n ucfoohhnjhgrlhhonhcuoehthhhomhgrshesmhhonhhjrghlohhnrdhnvghtqeenucggtf\n frrghtthgvrhhnpedvhefgiedvjeegtdevheefhfetleefgfeivefgffevfeejgedtgfeu\n tdehtdegveenucevlhhushhtvghrufhiiigvpedunecurfgrrhgrmhepmhgrihhlfhhroh\n hmpehthhhomhgrshesmhhonhhjrghlohhnrdhnvght",
        "X-ME-Proxy": "<xmx:GgUEYZpmr8IhzCl-F6OTGEM9NNMvbnPWPIwdQF_B5vOBwVqInPqETw>\n <xmx:GgUEYerPGNkBBgCSg8bBhmrxFh8l_3f4FV7OBepPSvG7XJqDp4hzjw>\n <xmx:GgUEYfRe-9IlNpc1qpohkLx_0yJgE3NbHHPjSM4EnSX4cb50cCpNLQ>\n <xmx:GgUEYacWA3VlEYxgf15r67zpUBiEpa3mz0x94D_p4IaCcdwJDvp6zg>",
        "From": "Thomas Monjalon <thomas@monjalon.net>",
        "To": "dev@dpdk.org",
        "Cc": "Stephen Hemminger <stephen@networkplumber.org>,\n David Marchand <david.marchand@redhat.com>,\n Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>,\n Haiyue Wang <haiyue.wang@intel.com>,\n Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>,\n Jerin Jacob <jerinj@marvell.com>, Ferruh Yigit <ferruh.yigit@intel.com>,\n Elena Agostini <eagostini@nvidia.com>, Ray Kinsella <mdr@ashroe.eu>",
        "Date": "Fri, 30 Jul 2021 15:55:33 +0200",
        "Message-Id": "<20210730135533.417611-8-thomas@monjalon.net>",
        "X-Mailer": "git-send-email 2.31.1",
        "In-Reply-To": "<20210730135533.417611-1-thomas@monjalon.net>",
        "References": "<20210602203531.2288645-1-thomas@monjalon.net>\n <20210730135533.417611-1-thomas@monjalon.net>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [RFC PATCH v2 7/7] hcdev: add communication list",
        "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": "From: Elena Agostini <eagostini@nvidia.com>\n\nIn heterogeneous computing system, processing is not only in the CPU.\nSome tasks can be delegated to devices working in parallel.\nWhen mixing network activity with task processing there may be the need\nto put in communication the CPU with the device in order to synchronize\noperations.\n\nAn example could be a receive-and-process application\nwhere CPU is responsible for receiving packets in multiple mbufs\nand the device is responsible for processing the content of those packets.\n\nThe purpose of this list is to provide a buffer in CPU memory visible\nfrom the device that can be treated as a circular buffer\nto let the CPU provide fondamental info of received packets to the device.\n\nA possible use-case is described below.\n\nCPU:\n- Trigger some task on the device\n- in a loop:\n    - receive a number of packets\n    - provide packets info to the device\n\nDevice:\n- Do some pre-processing\n- Wait to receive a new set of packet to be processed\n\nLayout of a communication list would be:\n\n     -------\n    |   0    | => pkt_list\n    | status |\n    | #pkts  |\n     -------\n    |   1    | => pkt_list\n    | status |\n    | #pkts  |\n     -------\n    |   2    | => pkt_list\n    | status |\n    | #pkts  |\n     -------\n    |  ....  | => pkt_list\n     -------\n\nSigned-off-by: Elena Agostini <eagostini@nvidia.com>\n---\n lib/hcdev/hcdev.c     | 127 ++++++++++++++++++++++++++++++++++++++++\n lib/hcdev/meson.build |   2 +\n lib/hcdev/rte_hcdev.h | 132 ++++++++++++++++++++++++++++++++++++++++++\n lib/hcdev/version.map |   4 ++\n 4 files changed, 265 insertions(+)",
    "diff": "diff --git a/lib/hcdev/hcdev.c b/lib/hcdev/hcdev.c\nindex e391988e73..572f1713fc 100644\n--- a/lib/hcdev/hcdev.c\n+++ b/lib/hcdev/hcdev.c\n@@ -660,3 +660,130 @@ rte_hcdev_comm_get_flag_value(struct rte_hcdev_comm_flag *hcflag, uint32_t *val)\n \n \treturn 0;\n }\n+\n+struct rte_hcdev_comm_list *\n+rte_hcdev_comm_create_list(uint16_t dev_id,\n+\t\tuint32_t num_comm_items)\n+{\n+\tstruct rte_hcdev_comm_list *comm_list;\n+\tuint32_t idx_l;\n+\n+\tif (num_comm_items == 0) {\n+\t\trte_errno = EINVAL;\n+\t\treturn NULL;\n+\t}\n+\n+\tcomm_list = rte_hcdev_malloc(dev_id,\n+\t\t\tsizeof(struct rte_hcdev_comm_list) * num_comm_items,\n+\t\t\tRTE_HCDEV_MALLOC_REGISTER_FROM_CPU);\n+\tif (comm_list == NULL) {\n+\t\trte_errno = ENOMEM;\n+\t\treturn NULL;\n+\t}\n+\n+\tfor (idx_l = 0; idx_l < num_comm_items; idx_l++) {\n+\t\tcomm_list[idx_l].pkt_list =\n+\t\t\trte_hcdev_malloc(dev_id,\n+\t\t\t\t\tsizeof(struct rte_hcdev_comm_pkt) *\n+\t\t\t\t\tRTE_HCDEV_COMM_LIST_PKTS_MAX,\n+\t\t\t\t\tRTE_HCDEV_MALLOC_REGISTER_FROM_CPU);\n+\t\tif (comm_list[idx_l].pkt_list == NULL) {\n+\t\t\trte_errno = ENOMEM;\n+\t\t\treturn NULL;\n+\t\t}\n+\n+\t\tRTE_HCDEV_VOLATILE(comm_list[idx_l].status) =\n+\t\t\tRTE_HCDEV_COMM_LIST_FREE;\n+\t\tcomm_list[idx_l].num_pkts = 0;\n+\t}\n+\n+\treturn comm_list;\n+}\n+\n+int\n+rte_hcdev_comm_destroy_list(uint16_t dev_id,\n+\t\tstruct rte_hcdev_comm_list *comm_list,\n+\t\tuint32_t num_comm_items)\n+{\n+\tuint32_t idx_l;\n+\n+\tif (comm_list == NULL) {\n+\t\trte_errno = EINVAL;\n+\t\treturn -rte_errno;\n+\t}\n+\n+\tfor (idx_l = 0; idx_l < num_comm_items; idx_l++)\n+\t\trte_hcdev_free(dev_id, comm_list[idx_l].pkt_list);\n+\trte_hcdev_free(dev_id, comm_list);\n+\n+\treturn 0;\n+}\n+\n+int\n+rte_hcdev_comm_populate_list_pkts(struct rte_hcdev_comm_list *comm_list_item,\n+\t\tstruct rte_mbuf **mbufs, uint32_t num_mbufs)\n+{\n+\tuint32_t idx;\n+\n+\tif (comm_list_item == NULL || comm_list_item->pkt_list == NULL ||\n+\t\t\tmbufs == NULL || num_mbufs > RTE_HCDEV_COMM_LIST_PKTS_MAX) {\n+\t\trte_errno = EINVAL;\n+\t\treturn -rte_errno;\n+\t}\n+\n+\tfor (idx = 0; idx < num_mbufs; idx++) {\n+\t\t/* support only unchained mbufs */\n+\t\tif (unlikely((mbufs[idx]->nb_segs > 1) ||\n+\t\t\t\t(mbufs[idx]->next != NULL) ||\n+\t\t\t\t(mbufs[idx]->data_len != mbufs[idx]->pkt_len))) {\n+\t\t\trte_errno = ENOTSUP;\n+\t\t\treturn -rte_errno;\n+\t\t}\n+\t\tcomm_list_item->pkt_list[idx].addr =\n+\t\t\t\trte_pktmbuf_mtod_offset(mbufs[idx], uintptr_t, 0);\n+\t\tcomm_list_item->pkt_list[idx].size = mbufs[idx]->pkt_len;\n+\t\tcomm_list_item->pkt_list[idx].opaque = mbufs[idx];\n+\t}\n+\n+\tRTE_HCDEV_VOLATILE(comm_list_item->num_pkts) = num_mbufs;\n+\trte_mb();\n+\tRTE_HCDEV_VOLATILE(comm_list_item->status) = RTE_HCDEV_COMM_LIST_READY;\n+\n+\treturn 0;\n+}\n+\n+int\n+rte_hcdev_comm_cleanup_list(struct rte_hcdev_comm_list *comm_list_item)\n+{\n+\tstruct rte_mbuf *mbufs[RTE_HCDEV_COMM_LIST_PKTS_MAX];\n+\tuint32_t idx = 0;\n+\n+\tif (comm_list_item == NULL) {\n+\t\trte_errno = EINVAL;\n+\t\treturn -rte_errno;\n+\t}\n+\n+\tif (RTE_HCDEV_VOLATILE(comm_list_item->status) ==\n+\t\t\tRTE_HCDEV_COMM_LIST_READY) {\n+\t\tHCDEV_LOG(ERR, \"packet list is still in progress\");\n+\t\trte_errno = EINVAL;\n+\t\treturn -rte_errno;\n+\t}\n+\n+\tfor (idx = 0; idx < RTE_HCDEV_COMM_LIST_PKTS_MAX; idx++) {\n+\t\tif (comm_list_item->pkt_list[idx].addr == 0)\n+\t\t\tbreak;\n+\n+\t\tcomm_list_item->pkt_list[idx].addr = 0;\n+\t\tcomm_list_item->pkt_list[idx].size = 0;\n+\t\tmbufs[idx] = (struct rte_mbuf *) comm_list_item->pkt_list[idx].opaque;\n+\t}\n+\n+\trte_pktmbuf_free_bulk(mbufs, idx);\n+\n+\tRTE_HCDEV_VOLATILE(comm_list_item->status) = RTE_HCDEV_COMM_LIST_FREE;\n+\tRTE_HCDEV_VOLATILE(comm_list_item->num_pkts) = 0;\n+\trte_mb();\n+\n+\treturn 0;\n+}\ndiff --git a/lib/hcdev/meson.build b/lib/hcdev/meson.build\nindex 565c3cb623..249849e0cb 100644\n--- a/lib/hcdev/meson.build\n+++ b/lib/hcdev/meson.build\n@@ -8,3 +8,5 @@ headers = files(\n sources = files(\n         'hcdev.c',\n )\n+\n+deps += ['mbuf']\ndiff --git a/lib/hcdev/rte_hcdev.h b/lib/hcdev/rte_hcdev.h\nindex 7b58041b3c..78f0e92957 100644\n--- a/lib/hcdev/rte_hcdev.h\n+++ b/lib/hcdev/rte_hcdev.h\n@@ -9,6 +9,7 @@\n #include <stdint.h>\n #include <stdbool.h>\n \n+#include <rte_mbuf.h>\n #include <rte_bitops.h>\n #include <rte_compat.h>\n \n@@ -41,6 +42,9 @@ extern \"C\" {\n /** Access variable as volatile. */\n #define RTE_HCDEV_VOLATILE(x) (*(volatile typeof(x)*)&(x))\n \n+/** Max number of packets per communication list. */\n+#define RTE_HCDEV_COMM_LIST_PKTS_MAX 1024\n+\n /** Store device info. */\n struct rte_hcdev_info {\n \t/** Unique identifier name. */\n@@ -79,10 +83,47 @@ enum rte_hcdev_comm_flag_type {\n \n /** Communication flag to coordinate CPU with the device. */\n struct rte_hcdev_comm_flag {\n+\t/** Pointer to flag memory area. */\n \tuint32_t *ptr;\n+\t/** Type of memory used to allocate the flag. */\n \tenum rte_hcdev_comm_flag_type mtype;\n };\n \n+/** List of packets shared among CPU and device. */\n+struct rte_hcdev_comm_pkt {\n+\t/** Address of the packet in memory (e.g. mbuf->buf_addr). */\n+\tuintptr_t addr;\n+\t/** Size in byte of the packet. */\n+\tsize_t size;\n+\t/** Mbuf reference to release it in the rte_hcdev_comm_cleanup_list(). */\n+\tvoid *opaque;\n+};\n+\n+/** Possible status for the list of packets shared among CPU and device. */\n+enum rte_hcdev_comm_list_status {\n+\t/** Packet list can be filled with new mbufs, no one is using it. */\n+\tRTE_HCDEV_COMM_LIST_FREE = 0,\n+\t/** Packet list has been filled with new mbufs and it's ready to be used .*/\n+\tRTE_HCDEV_COMM_LIST_READY,\n+\t/** Packet list has been processed, it's ready to be freed. */\n+\tRTE_HCDEV_COMM_LIST_DONE,\n+\t/** Some error occurred during packet list processing. */\n+\tRTE_HCDEV_COMM_LIST_ERROR,\n+};\n+\n+/**\n+ * Communication list holding a number of lists of packets\n+ * each having a status flag.\n+ */\n+struct rte_hcdev_comm_list {\n+\t/** List of packets populated by the CPU with a set of mbufs info. */\n+\tstruct rte_hcdev_comm_pkt *pkt_list;\n+\t/** Number of packets in the list. */\n+\tuint32_t num_pkts;\n+\t/** Status of the list. */\n+\tenum rte_hcdev_comm_list_status status;\n+};\n+\n /**\n  * @warning\n  * @b EXPERIMENTAL: this API may change without prior notice.\n@@ -453,6 +494,97 @@ __rte_experimental\n int rte_hcdev_comm_get_flag_value(struct rte_hcdev_comm_flag *hcflag,\n \t\tuint32_t *val);\n \n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice.\n+ *\n+ * Create a communication list that can be used to share packets\n+ * between CPU and device.\n+ * Each element of the list contains:\n+ *  - a packet list of RTE_HCDEV_COMM_LIST_PKTS_MAX elements\n+ *  - number of packets in the list\n+ *  - a status flag to communicate if the packet list is FREE,\n+ *    READY to be processed, DONE with processing.\n+ *\n+ * The list is allocated in CPU-visible memory.\n+ * At creation time, every list is in FREE state.\n+ *\n+ * @param dev_id\n+ *   Reference device ID.\n+ * @param num_comm_items\n+ *   Number of items in the communication list.\n+ *\n+ * @return\n+ *   A pointer to the allocated list, otherwise NULL and rte_errno is set:\n+ *   - EINVAL if invalid input params\n+ */\n+__rte_experimental\n+struct rte_hcdev_comm_list *rte_hcdev_comm_create_list(uint16_t dev_id,\n+\t\tuint32_t num_comm_items);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice.\n+ *\n+ * Destroy a communication list.\n+ *\n+ * @param dev_id\n+ *   Reference device ID.\n+ * @param comm_list\n+ *   Communication list to be destroyed.\n+ * @param num_comm_items\n+ *   Number of items in the communication list.\n+ *\n+ * @return\n+ *   0 on success, -rte_errno otherwise:\n+ *   - EINVAL if invalid input params\n+ */\n+__rte_experimental\n+int rte_hcdev_comm_destroy_list(uint16_t dev_id,\n+\t\tstruct rte_hcdev_comm_list *comm_list,\n+\t\tuint32_t num_comm_items);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice.\n+ *\n+ * Populate the packets list of the communication item\n+ * with info from a list of mbufs.\n+ * Status flag of that packet list is set to READY.\n+ *\n+ * @param comm_list_item\n+ *   Communication list item to fill.\n+ * @param mbufs\n+ *   List of mbufs.\n+ * @param num_mbufs\n+ *   Number of mbufs.\n+ *\n+ * @return\n+ *   0 on success, -rte_errno otherwise:\n+ *   - EINVAL if invalid input params\n+ *   - ENOTSUP if mbufs are chained (multiple segments)\n+ */\n+__rte_experimental\n+int rte_hcdev_comm_populate_list_pkts(struct rte_hcdev_comm_list *comm_list_item,\n+\t\tstruct rte_mbuf **mbufs, uint32_t num_mbufs);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice.\n+ *\n+ * Reset a communication list item to the original state.\n+ * The status flag set to FREE and mbufs are returned to the pool.\n+ *\n+ * @param comm_list_item\n+ *   Communication list item to reset.\n+ *\n+ * @return\n+ *   0 on success, -rte_errno otherwise:\n+ *   - EINVAL if invalid input params\n+ */\n+__rte_experimental\n+int rte_hcdev_comm_cleanup_list(struct rte_hcdev_comm_list *comm_list_item);\n+\n #ifdef __cplusplus\n }\n #endif\ndiff --git a/lib/hcdev/version.map b/lib/hcdev/version.map\nindex da969c7f1f..caa00af647 100644\n--- a/lib/hcdev/version.map\n+++ b/lib/hcdev/version.map\n@@ -6,9 +6,13 @@ EXPERIMENTAL {\n \trte_hcdev_callback_register;\n \trte_hcdev_callback_unregister;\n \trte_hcdev_close;\n+\trte_hcdev_comm_cleanup_list;\n \trte_hcdev_comm_create_flag;\n+\trte_hcdev_comm_create_list;\n \trte_hcdev_comm_destroy_flag;\n+\trte_hcdev_comm_destroy_list;\n \trte_hcdev_comm_get_flag_value;\n+\trte_hcdev_comm_populate_list_pkts;\n \trte_hcdev_comm_set_flag;\n \trte_hcdev_count_avail;\n \trte_hcdev_find_next;\n",
    "prefixes": [
        "RFC",
        "v2",
        "7/7"
    ]
}