get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 90186,
    "url": "http://patches.dpdk.org/api/patches/90186/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20210331073749.1382377-4-suanmingm@nvidia.com/",
    "project": {
        "id": 1,
        "url": "http://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": "<20210331073749.1382377-4-suanmingm@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210331073749.1382377-4-suanmingm@nvidia.com",
    "date": "2021-03-31T07:37:48",
    "name": "[v4,3/4] app/test-regex: support scattered mbuf input",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "c8b89a67ac51a09ddc601bbbc425c1eba8fb5ee2",
    "submitter": {
        "id": 1887,
        "url": "http://patches.dpdk.org/api/people/1887/?format=api",
        "name": "Suanming Mou",
        "email": "suanmingm@nvidia.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20210331073749.1382377-4-suanmingm@nvidia.com/mbox/",
    "series": [
        {
            "id": 15999,
            "url": "http://patches.dpdk.org/api/series/15999/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=15999",
            "date": "2021-03-31T07:37:45",
            "name": "regex/mlx5: support scattered mbuf",
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/15999/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/90186/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/90186/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 74420A034F;\n\tWed, 31 Mar 2021 09:38:42 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 36496140E10;\n\tWed, 31 Mar 2021 09:38:04 +0200 (CEST)",
            "from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129])\n by mails.dpdk.org (Postfix) with ESMTP id 71AE2140E10\n for <dev@dpdk.org>; Wed, 31 Mar 2021 09:38:00 +0200 (CEST)",
            "from Internal Mail-Server by MTLPINE1 (envelope-from\n suanmingm@nvidia.com) with SMTP; 31 Mar 2021 10:37:57 +0300",
            "from nvidia.com (mtbc-r640-03.mtbc.labs.mlnx [10.75.70.8])\n by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 12V7boeH002108;\n Wed, 31 Mar 2021 10:37:56 +0300"
        ],
        "From": "Suanming Mou <suanmingm@nvidia.com>",
        "To": "orika@nvidia.com",
        "Cc": "dev@dpdk.org, viacheslavo@nvidia.com, matan@nvidia.com, rasland@nvidia.com",
        "Date": "Wed, 31 Mar 2021 10:37:48 +0300",
        "Message-Id": "<20210331073749.1382377-4-suanmingm@nvidia.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20210331073749.1382377-1-suanmingm@nvidia.com>",
        "References": "<20210309235732.3952418-1-suanmingm@nvidia.com>\n <20210331073749.1382377-1-suanmingm@nvidia.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v4 3/4] app/test-regex: support scattered mbuf\n input",
        "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": "This commits adds the scattered mbuf input support.\n\nSigned-off-by: Suanming Mou <suanmingm@nvidia.com>\nAcked-by: Ori Kam <orika@nvidia.com>\n---\n app/test-regex/main.c          | 134 +++++++++++++++++++++++++++------\n doc/guides/tools/testregex.rst |   3 +\n 2 files changed, 112 insertions(+), 25 deletions(-)",
    "diff": "diff --git a/app/test-regex/main.c b/app/test-regex/main.c\nindex aea4fa6b88..82cffaacfa 100644\n--- a/app/test-regex/main.c\n+++ b/app/test-regex/main.c\n@@ -35,6 +35,7 @@ enum app_args {\n \tARG_NUM_OF_ITERATIONS,\n \tARG_NUM_OF_QPS,\n \tARG_NUM_OF_LCORES,\n+\tARG_NUM_OF_MBUF_SEGS,\n };\n \n struct job_ctx {\n@@ -70,6 +71,7 @@ struct regex_conf {\n \tchar *data_buf;\n \tlong data_len;\n \tlong job_len;\n+\tuint32_t nb_segs;\n };\n \n static void\n@@ -82,14 +84,15 @@ usage(const char *prog_name)\n \t\t\" --perf N: only outputs the performance data\\n\"\n \t\t\" --nb_iter N: number of iteration to run\\n\"\n \t\t\" --nb_qps N: number of queues to use\\n\"\n-\t\t\" --nb_lcores N: number of lcores to use\\n\",\n+\t\t\" --nb_lcores N: number of lcores to use\\n\"\n+\t\t\" --nb_segs N: number of mbuf segments\\n\",\n \t\tprog_name);\n }\n \n static void\n args_parse(int argc, char **argv, char *rules_file, char *data_file,\n \t   uint32_t *nb_jobs, bool *perf_mode, uint32_t *nb_iterations,\n-\t   uint32_t *nb_qps, uint32_t *nb_lcores)\n+\t   uint32_t *nb_qps, uint32_t *nb_lcores, uint32_t *nb_segs)\n {\n \tchar **argvopt;\n \tint opt;\n@@ -111,6 +114,8 @@ args_parse(int argc, char **argv, char *rules_file, char *data_file,\n \t\t{ \"nb_qps\", 1, 0, ARG_NUM_OF_QPS},\n \t\t/* Number of lcores. */\n \t\t{ \"nb_lcores\", 1, 0, ARG_NUM_OF_LCORES},\n+\t\t/* Number of mbuf segments. */\n+\t\t{ \"nb_segs\", 1, 0, ARG_NUM_OF_MBUF_SEGS},\n \t\t/* End of options */\n \t\t{ 0, 0, 0, 0 }\n \t};\n@@ -150,6 +155,9 @@ args_parse(int argc, char **argv, char *rules_file, char *data_file,\n \t\tcase ARG_NUM_OF_LCORES:\n \t\t\t*nb_lcores = atoi(optarg);\n \t\t\tbreak;\n+\t\tcase ARG_NUM_OF_MBUF_SEGS:\n+\t\t\t*nb_segs = atoi(optarg);\n+\t\t\tbreak;\n \t\tcase ARG_HELP:\n \t\t\tusage(\"RegEx test app\");\n \t\t\tbreak;\n@@ -302,11 +310,75 @@ extbuf_free_cb(void *addr __rte_unused, void *fcb_opaque __rte_unused)\n {\n }\n \n+static inline struct rte_mbuf *\n+regex_create_segmented_mbuf(struct rte_mempool *mbuf_pool, int pkt_len,\n+\t\tint nb_segs, void *buf) {\n+\n+\tstruct rte_mbuf *m = NULL, *mbuf = NULL;\n+\tuint8_t *dst;\n+\tchar *src = buf;\n+\tint data_len = 0;\n+\tint i, size;\n+\tint t_len;\n+\n+\tif (pkt_len < 1) {\n+\t\tprintf(\"Packet size must be 1 or more (is %d)\\n\", pkt_len);\n+\t\treturn NULL;\n+\t}\n+\n+\tif (nb_segs < 1) {\n+\t\tprintf(\"Number of segments must be 1 or more (is %d)\\n\",\n+\t\t\t\tnb_segs);\n+\t\treturn NULL;\n+\t}\n+\n+\tt_len = pkt_len >= nb_segs ? (pkt_len / nb_segs +\n+\t\t\t\t     !!(pkt_len % nb_segs)) : 1;\n+\tsize = pkt_len;\n+\n+\t/* Create chained mbuf_src and fill it with buf data */\n+\tfor (i = 0; size > 0; i++) {\n+\n+\t\tm = rte_pktmbuf_alloc(mbuf_pool);\n+\t\tif (i == 0)\n+\t\t\tmbuf = m;\n+\n+\t\tif (m == NULL) {\n+\t\t\tprintf(\"Cannot create segment for source mbuf\");\n+\t\t\tgoto fail;\n+\t\t}\n+\n+\t\tdata_len = size > t_len ? t_len : size;\n+\t\tmemset(rte_pktmbuf_mtod(m, uint8_t *), 0,\n+\t\t\t\trte_pktmbuf_tailroom(m));\n+\t\tmemcpy(rte_pktmbuf_mtod(m, uint8_t *), src, data_len);\n+\t\tdst = (uint8_t *)rte_pktmbuf_append(m, data_len);\n+\t\tif (dst == NULL) {\n+\t\t\tprintf(\"Cannot append %d bytes to the mbuf\\n\",\n+\t\t\t\t\tdata_len);\n+\t\t\tgoto fail;\n+\t\t}\n+\n+\t\tif (mbuf != m)\n+\t\t\trte_pktmbuf_chain(mbuf, m);\n+\t\tsrc += data_len;\n+\t\tsize -= data_len;\n+\n+\t}\n+\treturn mbuf;\n+\n+fail:\n+\tif (mbuf)\n+\t\trte_pktmbuf_free(mbuf);\n+\treturn NULL;\n+}\n+\n static int\n run_regex(void *args)\n {\n \tstruct regex_conf *rgxc = args;\n \tuint32_t nb_jobs = rgxc->nb_jobs;\n+\tuint32_t nb_segs = rgxc->nb_segs;\n \tuint32_t nb_iterations = rgxc->nb_iterations;\n \tuint8_t nb_max_matches = rgxc->nb_max_matches;\n \tuint32_t nb_qps = rgxc->nb_qps;\n@@ -338,8 +410,12 @@ run_regex(void *args)\n \tsnprintf(mbuf_pool,\n \t\t sizeof(mbuf_pool),\n \t\t \"mbuf_pool_%2u\", qp_id_base);\n-\tmbuf_mp = rte_pktmbuf_pool_create(mbuf_pool, nb_jobs * nb_qps, 0,\n-\t\t\t0, MBUF_SIZE, rte_socket_id());\n+\tmbuf_mp = rte_pktmbuf_pool_create(mbuf_pool,\n+\t\t\trte_align32pow2(nb_jobs * nb_qps * nb_segs),\n+\t\t\t0, 0, (nb_segs == 1) ? MBUF_SIZE :\n+\t\t\t(rte_align32pow2(job_len) / nb_segs +\n+\t\t\tRTE_PKTMBUF_HEADROOM),\n+\t\t\trte_socket_id());\n \tif (mbuf_mp == NULL) {\n \t\tprintf(\"Error, can't create memory pool\\n\");\n \t\treturn -ENOMEM;\n@@ -375,8 +451,19 @@ run_regex(void *args)\n \t\t\tgoto end;\n \t\t}\n \n+\t\tif (clone_buf(data_buf, &buf, data_len)) {\n+\t\t\tprintf(\"Error, can't clone buf.\\n\");\n+\t\t\tres = -EXIT_FAILURE;\n+\t\t\tgoto end;\n+\t\t}\n+\n+\t\t/* Assign each mbuf with the data to handle. */\n+\t\tactual_jobs = 0;\n+\t\tpos = 0;\n \t\t/* Allocate the jobs and assign each job with an mbuf. */\n-\t\tfor (i = 0; i < nb_jobs; i++) {\n+\t\tfor (i = 0; (pos < data_len) && (i < nb_jobs) ; i++) {\n+\t\t\tlong act_job_len = RTE_MIN(job_len, data_len - pos);\n+\n \t\t\tops[i] = rte_malloc(NULL, sizeof(*ops[0]) +\n \t\t\t\t\tnb_max_matches *\n \t\t\t\t\tsizeof(struct rte_regexdev_match), 0);\n@@ -386,30 +473,26 @@ run_regex(void *args)\n \t\t\t\tres = -ENOMEM;\n \t\t\t\tgoto end;\n \t\t\t}\n-\t\t\tops[i]->mbuf = rte_pktmbuf_alloc(mbuf_mp);\n+\t\t\tif (nb_segs > 1) {\n+\t\t\t\tops[i]->mbuf = regex_create_segmented_mbuf\n+\t\t\t\t\t\t\t(mbuf_mp, act_job_len,\n+\t\t\t\t\t\t\t nb_segs, &buf[pos]);\n+\t\t\t} else {\n+\t\t\t\tops[i]->mbuf = rte_pktmbuf_alloc(mbuf_mp);\n+\t\t\t\tif (ops[i]->mbuf) {\n+\t\t\t\t\trte_pktmbuf_attach_extbuf(ops[i]->mbuf,\n+\t\t\t\t\t&buf[pos], 0, act_job_len, &shinfo);\n+\t\t\t\t\tops[i]->mbuf->data_len = job_len;\n+\t\t\t\t\tops[i]->mbuf->pkt_len = act_job_len;\n+\t\t\t\t}\n+\t\t\t}\n \t\t\tif (!ops[i]->mbuf) {\n-\t\t\t\tprintf(\"Error, can't attach mbuf.\\n\");\n+\t\t\t\tprintf(\"Error, can't add mbuf.\\n\");\n \t\t\t\tres = -ENOMEM;\n \t\t\t\tgoto end;\n \t\t\t}\n-\t\t}\n \n-\t\tif (clone_buf(data_buf, &buf, data_len)) {\n-\t\t\tprintf(\"Error, can't clone buf.\\n\");\n-\t\t\tres = -EXIT_FAILURE;\n-\t\t\tgoto end;\n-\t\t}\n-\n-\t\t/* Assign each mbuf with the data to handle. */\n-\t\tactual_jobs = 0;\n-\t\tpos = 0;\n-\t\tfor (i = 0; (pos < data_len) && (i < nb_jobs) ; i++) {\n-\t\t\tlong act_job_len = RTE_MIN(job_len, data_len - pos);\n-\t\t\trte_pktmbuf_attach_extbuf(ops[i]->mbuf, &buf[pos], 0,\n-\t\t\t\t\tact_job_len, &shinfo);\n \t\t\tjobs_ctx[i].mbuf = ops[i]->mbuf;\n-\t\t\tops[i]->mbuf->data_len = job_len;\n-\t\t\tops[i]->mbuf->pkt_len = act_job_len;\n \t\t\tops[i]->user_id = i;\n \t\t\tops[i]->group_id0 = 1;\n \t\t\tpos += act_job_len;\n@@ -612,7 +695,7 @@ main(int argc, char **argv)\n \tchar *data_buf;\n \tlong data_len;\n \tlong job_len;\n-\tuint32_t nb_lcores = 1;\n+\tuint32_t nb_lcores = 1, nb_segs = 1;\n \tstruct regex_conf *rgxc;\n \tuint32_t i;\n \tstruct qps_per_lcore *qps_per_lcore;\n@@ -626,7 +709,7 @@ main(int argc, char **argv)\n \tif (argc > 1)\n \t\targs_parse(argc, argv, rules_file, data_file, &nb_jobs,\n \t\t\t\t&perf_mode, &nb_iterations, &nb_qps,\n-\t\t\t\t&nb_lcores);\n+\t\t\t\t&nb_lcores, &nb_segs);\n \n \tif (nb_qps == 0)\n \t\trte_exit(EXIT_FAILURE, \"Number of QPs must be greater than 0\\n\");\n@@ -656,6 +739,7 @@ main(int argc, char **argv)\n \tfor (i = 0; i < nb_lcores; i++) {\n \t\trgxc[i] = (struct regex_conf){\n \t\t\t.nb_jobs = nb_jobs,\n+\t\t\t.nb_segs = nb_segs,\n \t\t\t.perf_mode = perf_mode,\n \t\t\t.nb_iterations = nb_iterations,\n \t\t\t.nb_max_matches = nb_max_matches,\ndiff --git a/doc/guides/tools/testregex.rst b/doc/guides/tools/testregex.rst\nindex a59acd919f..cdb1ffd6ee 100644\n--- a/doc/guides/tools/testregex.rst\n+++ b/doc/guides/tools/testregex.rst\n@@ -68,6 +68,9 @@ Application Options\n ``--nb_iter N``\n   number of iteration to run\n \n+``--nb_segs N``\n+  number of mbuf segment\n+\n ``--help``\n   print application options\n \n",
    "prefixes": [
        "v4",
        "3/4"
    ]
}