get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 120242,
    "url": "https://patches.dpdk.org/api/patches/120242/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20221129070746.20396-9-syalavarthi@marvell.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": "<20221129070746.20396-9-syalavarthi@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20221129070746.20396-9-syalavarthi@marvell.com",
    "date": "2022-11-29T07:07:42",
    "name": "[v1,08/12] app/mldev: enable support for queue pairs and size",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "fbd382673c060eeb87b025a5f9fa6209ddc12717",
    "submitter": {
        "id": 2480,
        "url": "https://patches.dpdk.org/api/people/2480/?format=api",
        "name": "Srikanth Yalavarthi",
        "email": "syalavarthi@marvell.com"
    },
    "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/20221129070746.20396-9-syalavarthi@marvell.com/mbox/",
    "series": [
        {
            "id": 25913,
            "url": "https://patches.dpdk.org/api/series/25913/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=25913",
            "date": "2022-11-29T07:07:34",
            "name": "implement mldev test application",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/25913/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/120242/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/120242/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 92162A0093;\n\tTue, 29 Nov 2022 08:09:02 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id D92FB42D4E;\n\tTue, 29 Nov 2022 08:08:12 +0100 (CET)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173])\n by mails.dpdk.org (Postfix) with ESMTP id DFF9E4021E\n for <dev@dpdk.org>; Tue, 29 Nov 2022 08:08:02 +0100 (CET)",
            "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id\n 2ASNuTx6020795 for <dev@dpdk.org>; Mon, 28 Nov 2022 23:08:02 -0800",
            "from dc5-exch02.marvell.com ([199.233.59.182])\n by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3m3k6wa3r3-5\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT)\n for <dev@dpdk.org>; Mon, 28 Nov 2022 23:08:02 -0800",
            "from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.18;\n Mon, 28 Nov 2022 23:07:59 -0800",
            "from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.2 via Frontend\n Transport; Mon, 28 Nov 2022 23:07:59 -0800",
            "from ml-host-33.caveonetworks.com (unknown [10.110.143.233])\n by maili.marvell.com (Postfix) with ESMTP id 0F5B23F707B;\n Mon, 28 Nov 2022 23:07:59 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : in-reply-to : references : mime-version :\n content-type; s=pfpt0220; bh=EuTpdvFqDqWxdrJozTvLsk6u7PqpH3aWHM+yybYobF4=;\n b=LdITJdxduxJZC7Xg/KTz7vimC4/KWF0KfKyztziROTliSKXRXoQZ3iJ8GDstthtwPQck\n XUv+D5YORTJ7aa/k6IdZwun5AULMwGMW1VScRtcMGdm2rPV9zJ7I5lW9mwQ004luat/4\n dhJ1qDASnzl4xULM4jKcOrsAhHoBkb8yOhGvbhB0Jv1aERD9FV/wL/gJWatlmGEwTKHN\n 8rrN61i3jVtMxIE0RSe0d7YQU/8Qi7SRhRlNZbSL2U5btnOmSm25R46D26/f0Vslgiq5\n EbrTiDjGSGxw67A3GI4ZbD4COQVz3DH3FWBqsY6LiIOHBpXLZf7jrTBSRnIyFF1TRBou Ig==",
        "From": "Srikanth Yalavarthi <syalavarthi@marvell.com>",
        "To": "Srikanth Yalavarthi <syalavarthi@marvell.com>",
        "CC": "<dev@dpdk.org>, <sshankarnara@marvell.com>, <jerinj@marvell.com>",
        "Subject": "[PATCH v1 08/12] app/mldev: enable support for queue pairs and size",
        "Date": "Mon, 28 Nov 2022 23:07:42 -0800",
        "Message-ID": "<20221129070746.20396-9-syalavarthi@marvell.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20221129070746.20396-1-syalavarthi@marvell.com>",
        "References": "<20221129070746.20396-1-syalavarthi@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Proofpoint-GUID": "gG_bFreW1pR60a7c1kgCVNc59bsT8kXZ",
        "X-Proofpoint-ORIG-GUID": "gG_bFreW1pR60a7c1kgCVNc59bsT8kXZ",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.219,Aquarius:18.0.895,Hydra:6.0.545,FMLib:17.11.122.1\n definitions=2022-11-29_06,2022-11-28_02,2022-06-22_01",
        "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"
    },
    "content": "Added support to create multiple queue-pairs per device to\nenqueue and dequeue inference requests. Number of queue pairs\nto be created can be specified through \"--queue_pairs\" option.\nSupport is also enabled to control the number of descriptors\nper each queue pair through \"--queue_size\" option. Inference\nrequests for a model are distributed across all available\nqueue-pairs.\n\nSigned-off-by: Srikanth Yalavarthi <syalavarthi@marvell.com>\n---\n app/test-mldev/ml_options.c            | 40 ++++++++++---\n app/test-mldev/ml_options.h            |  4 ++\n app/test-mldev/test_common.c           |  2 +-\n app/test-mldev/test_inference_common.c | 79 +++++++++++++++++++++-----\n app/test-mldev/test_inference_common.h |  1 +\n 5 files changed, 102 insertions(+), 24 deletions(-)",
    "diff": "diff --git a/app/test-mldev/ml_options.c b/app/test-mldev/ml_options.c\nindex 957218af3c..27b628c8b3 100644\n--- a/app/test-mldev/ml_options.c\n+++ b/app/test-mldev/ml_options.c\n@@ -31,6 +31,8 @@ ml_options_default(struct ml_options *opt)\n \topt->nb_filelist = 0;\n \topt->repetitions = 1;\n \topt->burst_size = 1;\n+\topt->queue_pairs = 1;\n+\topt->queue_size = 1;\n \topt->debug = false;\n }\n \n@@ -158,11 +160,30 @@ ml_parse_burst_size(struct ml_options *opt, const char *arg)\n \treturn parser_read_uint16(&opt->burst_size, arg);\n }\n \n+static int\n+ml_parse_queue_pairs(struct ml_options *opt, const char *arg)\n+{\n+\tint ret;\n+\n+\tret = parser_read_uint16(&opt->queue_pairs, arg);\n+\n+\treturn ret;\n+}\n+\n+static int\n+ml_parse_queue_size(struct ml_options *opt, const char *arg)\n+{\n+\treturn parser_read_uint16(&opt->queue_size, arg);\n+}\n+\n static void\n ml_dump_test_options(const char *testname)\n {\n-\tif (strcmp(testname, \"device_ops\") == 0)\n+\tif (strcmp(testname, \"device_ops\") == 0) {\n+\t\tprintf(\"\\t\\t--queue_pairs      : number of queue pairs to create\\n\"\n+\t\t       \"\\t\\t--queue_size       : size fo queue-pair\\n\");\n \t\tprintf(\"\\n\");\n+\t}\n \n \tif (strcmp(testname, \"model_ops\") == 0) {\n \t\tprintf(\"\\t\\t--models           : comma separated list of models\\n\");\n@@ -173,7 +194,9 @@ ml_dump_test_options(const char *testname)\n \t    (strcmp(testname, \"inference_interleave\") == 0)) {\n \t\tprintf(\"\\t\\t--filelist         : comma separated list of model, input and output\\n\"\n \t\t       \"\\t\\t--repetitions      : number of inference repetitions\\n\"\n-\t\t       \"\\t\\t--burst_size       : inference burst size\\n\");\n+\t\t       \"\\t\\t--burst_size       : inference burst size\\n\"\n+\t\t       \"\\t\\t--queue_pairs      : number of queue pairs to create\\n\"\n+\t\t       \"\\t\\t--queue_size       : size fo queue-pair\\n\");\n \t\tprintf(\"\\n\");\n \t}\n }\n@@ -193,11 +216,11 @@ print_usage(char *program)\n \tml_test_dump_names(ml_dump_test_options);\n }\n \n-static struct option lgopts[] = {{ML_TEST, 1, 0, 0},\t   {ML_DEVICE_ID, 1, 0, 0},\n-\t\t\t\t {ML_SOCKET_ID, 1, 0, 0},  {ML_MODELS, 1, 0, 0},\n-\t\t\t\t {ML_FILELIST, 1, 0, 0},   {ML_REPETITIONS, 1, 0, 0},\n-\t\t\t\t {ML_BURST_SIZE, 1, 0, 0}, {ML_DEBUG, 0, 0, 0},\n-\t\t\t\t {ML_HELP, 0, 0, 0},\t   {NULL, 0, 0, 0}};\n+static struct option lgopts[] = {\n+\t{ML_TEST, 1, 0, 0},\t  {ML_DEVICE_ID, 1, 0, 0},   {ML_SOCKET_ID, 1, 0, 0},\n+\t{ML_MODELS, 1, 0, 0},\t  {ML_FILELIST, 1, 0, 0},    {ML_REPETITIONS, 1, 0, 0},\n+\t{ML_BURST_SIZE, 1, 0, 0}, {ML_QUEUE_PAIRS, 1, 0, 0}, {ML_QUEUE_SIZE, 1, 0, 0},\n+\t{ML_DEBUG, 0, 0, 0},\t  {ML_HELP, 0, 0, 0},\t     {NULL, 0, 0, 0}};\n \n static int\n ml_opts_parse_long(int opt_idx, struct ml_options *opt)\n@@ -208,7 +231,8 @@ ml_opts_parse_long(int opt_idx, struct ml_options *opt)\n \t\t{ML_TEST, ml_parse_test_name},\t      {ML_DEVICE_ID, ml_parse_dev_id},\n \t\t{ML_SOCKET_ID, ml_parse_socket_id},   {ML_MODELS, ml_parse_models},\n \t\t{ML_FILELIST, ml_parse_filelist},     {ML_REPETITIONS, ml_parse_repetitions},\n-\t\t{ML_BURST_SIZE, ml_parse_burst_size},\n+\t\t{ML_BURST_SIZE, ml_parse_burst_size}, {ML_QUEUE_PAIRS, ml_parse_queue_pairs},\n+\t\t{ML_QUEUE_SIZE, ml_parse_queue_size},\n \t};\n \n \tfor (i = 0; i < RTE_DIM(parsermap); i++) {\ndiff --git a/app/test-mldev/ml_options.h b/app/test-mldev/ml_options.h\nindex 305b39629a..6bfef1b979 100644\n--- a/app/test-mldev/ml_options.h\n+++ b/app/test-mldev/ml_options.h\n@@ -20,6 +20,8 @@\n #define ML_FILELIST    (\"filelist\")\n #define ML_REPETITIONS (\"repetitions\")\n #define ML_BURST_SIZE  (\"burst_size\")\n+#define ML_QUEUE_PAIRS (\"queue_pairs\")\n+#define ML_QUEUE_SIZE  (\"queue_size\")\n #define ML_DEBUG       (\"debug\")\n #define ML_HELP\t       (\"help\")\n \n@@ -37,6 +39,8 @@ struct ml_options {\n \tuint8_t nb_filelist;\n \tuint64_t repetitions;\n \tuint16_t burst_size;\n+\tuint16_t queue_pairs;\n+\tuint16_t queue_size;\n \tbool debug;\n };\n \ndiff --git a/app/test-mldev/test_common.c b/app/test-mldev/test_common.c\nindex b6b32904e4..22e6acb3b6 100644\n--- a/app/test-mldev/test_common.c\n+++ b/app/test-mldev/test_common.c\n@@ -78,7 +78,7 @@ ml_test_device_configure(struct ml_test *test, struct ml_options *opt)\n \t/* configure device */\n \tdev_config.socket_id = opt->socket_id;\n \tdev_config.nb_models = t->dev_info.max_models;\n-\tdev_config.nb_queue_pairs = t->dev_info.max_queue_pairs;\n+\tdev_config.nb_queue_pairs = opt->queue_pairs;\n \tret = rte_ml_dev_configure(opt->dev_id, &dev_config);\n \tif (ret != 0) {\n \t\tml_err(\"Failed to configure ml device, dev_id = %d\\n\", opt->dev_id);\ndiff --git a/app/test-mldev/test_inference_common.c b/app/test-mldev/test_inference_common.c\nindex ea8106c4ec..a1111d9119 100644\n--- a/app/test-mldev/test_inference_common.c\n+++ b/app/test-mldev/test_inference_common.c\n@@ -72,7 +72,7 @@ ml_enqueue_single(void *arg)\n \treq->fid = fid;\n \n enqueue_req:\n-\tburst_enq = rte_ml_enqueue_burst(t->cmn.opt->dev_id, 0, &op, 1);\n+\tburst_enq = rte_ml_enqueue_burst(t->cmn.opt->dev_id, args->qp_id, &op, 1);\n \tif (burst_enq == 0)\n \t\tgoto enqueue_req;\n \n@@ -109,7 +109,7 @@ ml_dequeue_single(void *arg)\n \t\treturn 0;\n \n dequeue_req:\n-\tburst_deq = rte_ml_dequeue_burst(t->cmn.opt->dev_id, 0, &op, 1);\n+\tburst_deq = rte_ml_dequeue_burst(t->cmn.opt->dev_id, args->qp_id, &op, 1);\n \n \tif (likely(burst_deq == 1)) {\n \t\ttotal_deq += burst_deq;\n@@ -188,7 +188,8 @@ ml_enqueue_burst(void *arg)\n \tpending = ops_count;\n \n enqueue_reqs:\n-\tburst_enq = rte_ml_enqueue_burst(t->cmn.opt->dev_id, 0, &args->enq_ops[idx], pending);\n+\tburst_enq =\n+\t\trte_ml_enqueue_burst(t->cmn.opt->dev_id, args->qp_id, &args->enq_ops[idx], pending);\n \tpending = pending - burst_enq;\n \n \tif (pending > 0) {\n@@ -229,8 +230,8 @@ ml_dequeue_burst(void *arg)\n \t\treturn 0;\n \n dequeue_burst:\n-\tburst_deq =\n-\t\trte_ml_dequeue_burst(t->cmn.opt->dev_id, 0, args->deq_ops, t->cmn.opt->burst_size);\n+\tburst_deq = rte_ml_dequeue_burst(t->cmn.opt->dev_id, args->qp_id, args->deq_ops,\n+\t\t\t\t\t t->cmn.opt->burst_size);\n \n \tif (likely(burst_deq > 0)) {\n \t\ttotal_deq += burst_deq;\n@@ -263,6 +264,19 @@ test_inference_cap_check(struct ml_options *opt)\n \t\treturn false;\n \n \trte_ml_dev_info_get(opt->dev_id, &dev_info);\n+\n+\tif (opt->queue_pairs > dev_info.max_queue_pairs) {\n+\t\tml_err(\"Insufficient capabilities: queue_pairs = %u, max_queue_pairs = %u\",\n+\t\t       opt->queue_pairs, dev_info.max_queue_pairs);\n+\t\treturn false;\n+\t}\n+\n+\tif (opt->queue_size > dev_info.max_desc) {\n+\t\tml_err(\"Insufficient capabilities: queue_size = %u, max_desc = %u\", opt->queue_size,\n+\t\t       dev_info.max_desc);\n+\t\treturn false;\n+\t}\n+\n \tif (opt->nb_filelist > dev_info.max_models) {\n \t\tml_err(\"Insufficient capabilities:  Filelist count exceeded device limit, count = %u (max limit = %u)\",\n \t\t       opt->nb_filelist, dev_info.max_models);\n@@ -314,10 +328,21 @@ test_inference_opt_check(struct ml_options *opt)\n \t\treturn -EINVAL;\n \t}\n \n+\tif (opt->queue_pairs == 0) {\n+\t\tml_err(\"Invalid option, queue_pairs = %u\\n\", opt->queue_pairs);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (opt->queue_size == 0) {\n+\t\tml_err(\"Invalid option, queue_size = %u\\n\", opt->queue_size);\n+\t\treturn -EINVAL;\n+\t}\n+\n \t/* check number of available lcores. */\n-\tif (rte_lcore_count() < 3) {\n+\tif (rte_lcore_count() < (uint32_t)(opt->queue_pairs * 2 + 1)) {\n \t\tml_err(\"Insufficient lcores = %u\\n\", rte_lcore_count());\n-\t\tml_err(\"Minimum lcores required to create %u queue-pairs = %u\\n\", 1, 3);\n+\t\tml_err(\"Minimum lcores required to create %u queue-pairs = %u\\n\", opt->queue_pairs,\n+\t\t       (opt->queue_pairs * 2 + 1));\n \t\treturn -EINVAL;\n \t}\n \n@@ -335,6 +360,8 @@ test_inference_opt_dump(struct ml_options *opt)\n \t/* dump test opts */\n \tml_dump(\"repetitions\", \"%\" PRIu64, opt->repetitions);\n \tml_dump(\"burst_size\", \"%u\", opt->burst_size);\n+\tml_dump(\"queue_pairs\", \"%u\", opt->queue_pairs);\n+\tml_dump(\"queue_size\", \"%u\", opt->queue_size);\n \n \tml_dump_begin(\"filelist\");\n \tfor (i = 0; i < opt->nb_filelist; i++) {\n@@ -425,23 +452,31 @@ ml_inference_mldev_setup(struct ml_test *test, struct ml_options *opt)\n {\n \tstruct rte_ml_dev_qp_conf qp_conf;\n \tstruct test_inference *t;\n+\tuint16_t qp_id;\n \tint ret;\n \n \tt = ml_test_priv(test);\n \n+\tRTE_SET_USED(t);\n+\n \tret = ml_test_device_configure(test, opt);\n \tif (ret != 0)\n \t\treturn ret;\n \n \t/* setup queue pairs */\n-\tqp_conf.nb_desc = t->cmn.dev_info.max_desc;\n+\tqp_conf.nb_desc = opt->queue_size;\n \tqp_conf.cb = NULL;\n \n-\tret = rte_ml_dev_queue_pair_setup(opt->dev_id, 0, &qp_conf, opt->socket_id);\n-\tif (ret != 0) {\n-\t\tml_err(\"Failed to setup ml device queue-pair, dev_id = %d, qp_id = %u\\n\",\n-\t\t       opt->dev_id, 0);\n-\t\tgoto error;\n+\tfor (qp_id = 0; qp_id < opt->queue_pairs; qp_id++) {\n+\t\tqp_conf.nb_desc = opt->queue_size;\n+\t\tqp_conf.cb = NULL;\n+\n+\t\tret = rte_ml_dev_queue_pair_setup(opt->dev_id, qp_id, &qp_conf, opt->socket_id);\n+\t\tif (ret != 0) {\n+\t\t\tml_err(\"Failed to setup ml device queue-pair, dev_id = %d, qp_id = %u\\n\",\n+\t\t\t       opt->dev_id, qp_id);\n+\t\t\treturn ret;\n+\t\t}\n \t}\n \n \tret = ml_test_device_start(test, opt);\n@@ -697,14 +732,28 @@ ml_inference_launch_cores(struct ml_test *test, struct ml_options *opt, int16_t\n {\n \tstruct test_inference *t = ml_test_priv(test);\n \tuint32_t lcore_id;\n+\tuint32_t nb_reqs;\n \tuint32_t id = 0;\n+\tuint32_t qp_id;\n+\n+\tnb_reqs = opt->repetitions / opt->queue_pairs;\n \n \tRTE_LCORE_FOREACH_WORKER(lcore_id)\n \t{\n-\t\tif (id == 2)\n+\t\tif (id >= opt->queue_pairs * 2)\n \t\t\tbreak;\n \n-\t\tt->args[lcore_id].nb_reqs = opt->repetitions;\n+\t\tqp_id = id / 2;\n+\t\tt->args[lcore_id].qp_id = qp_id;\n+\t\tt->args[lcore_id].nb_reqs = nb_reqs;\n+\t\tif (qp_id == 0)\n+\t\t\tt->args[lcore_id].nb_reqs += opt->repetitions - nb_reqs * opt->queue_pairs;\n+\n+\t\tif (t->args[lcore_id].nb_reqs == 0) {\n+\t\t\tid++;\n+\t\t\tbreak;\n+\t\t}\n+\n \t\tt->args[lcore_id].start_fid = start_fid;\n \t\tt->args[lcore_id].end_fid = end_fid;\n \ndiff --git a/app/test-mldev/test_inference_common.h b/app/test-mldev/test_inference_common.h\nindex 75d588308b..1bac2dcfa0 100644\n--- a/app/test-mldev/test_inference_common.h\n+++ b/app/test-mldev/test_inference_common.h\n@@ -27,6 +27,7 @@ struct ml_core_args {\n \tuint64_t nb_reqs;\n \tint16_t start_fid;\n \tint16_t end_fid;\n+\tuint32_t qp_id;\n \n \tstruct rte_ml_op **enq_ops;\n \tstruct rte_ml_op **deq_ops;\n",
    "prefixes": [
        "v1",
        "08/12"
    ]
}