get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 116924,
    "url": "http://patches.dpdk.org/api/patches/116924/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20220927024756.947272-4-feifei.wang2@arm.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": "<20220927024756.947272-4-feifei.wang2@arm.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20220927024756.947272-4-feifei.wang2@arm.com",
    "date": "2022-09-27T02:47:56",
    "name": "[v2,3/3] examples/l3fwd: enable direct rearm mode",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "f449b1a08da9683b7ca70a58336b38773ec9b710",
    "submitter": {
        "id": 1771,
        "url": "http://patches.dpdk.org/api/people/1771/?format=api",
        "name": "Feifei Wang",
        "email": "feifei.wang2@arm.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20220927024756.947272-4-feifei.wang2@arm.com/mbox/",
    "series": [
        {
            "id": 24846,
            "url": "http://patches.dpdk.org/api/series/24846/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=24846",
            "date": "2022-09-27T02:47:53",
            "name": "Direct re-arming of buffers on receive side",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/24846/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/116924/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/116924/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 BD5C8A00C2;\n\tTue, 27 Sep 2022 04:48:27 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 01459427F9;\n\tTue, 27 Sep 2022 04:48:20 +0200 (CEST)",
            "from foss.arm.com (foss.arm.com [217.140.110.172])\n by mails.dpdk.org (Postfix) with ESMTP id 248FB427F5\n for <dev@dpdk.org>; Tue, 27 Sep 2022 04:48:19 +0200 (CEST)",
            "from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14])\n by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 43D50165C;\n Mon, 26 Sep 2022 19:48:25 -0700 (PDT)",
            "from net-x86-dell-8268.shanghai.arm.com\n (net-x86-dell-8268.shanghai.arm.com [10.169.210.116])\n by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id CC0A93F73D;\n Mon, 26 Sep 2022 19:48:16 -0700 (PDT)"
        ],
        "From": "Feifei Wang <feifei.wang2@arm.com>",
        "To": "",
        "Cc": "dev@dpdk.org, nd@arm.com, Feifei Wang <feifei.wang2@arm.com>,\n Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>,\n Ruifeng Wang <ruifeng.wang@arm.com>",
        "Subject": "[PATCH v2 3/3] examples/l3fwd: enable direct rearm mode",
        "Date": "Tue, 27 Sep 2022 10:47:56 +0800",
        "Message-Id": "<20220927024756.947272-4-feifei.wang2@arm.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20220927024756.947272-1-feifei.wang2@arm.com>",
        "References": "<20220927024756.947272-1-feifei.wang2@arm.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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": "Enable direct rearm mode in l3fwd. Users can use parameters:\n'--direct-rearm=(rx_portid,rx_queueid,tx_portid,tx_queueid)'\nto enable direct rearm.\n\nSuggested-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>\nSigned-off-by: Feifei Wang <feifei.wang2@arm.com>\nReviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>\nReviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>\n---\n examples/l3fwd/l3fwd.h     | 12 +++++\n examples/l3fwd/l3fwd_lpm.c | 22 +++++++++\n examples/l3fwd/main.c      | 94 +++++++++++++++++++++++++++++++++++++-\n 3 files changed, 127 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h\nindex 40b5f32a9e..db097e344c 100644\n--- a/examples/l3fwd/l3fwd.h\n+++ b/examples/l3fwd/l3fwd.h\n@@ -57,6 +57,10 @@\n #endif\n #define HASH_ENTRY_NUMBER_DEFAULT\t16\n \n+/* MAX number of direct rearm mapping entry */\n+#define MAX_DIRECT_REARM_ENTRY_NUMBER   16\n+#define MAX_DIRECT_REARM_QUEUE_PER_PORT 8\n+\n struct parm_cfg {\n \tconst char *rule_ipv4_name;\n \tconst char *rule_ipv6_name;\n@@ -114,6 +118,14 @@ extern struct parm_cfg parm_config;\n \n extern struct acl_algorithms acl_alg[];\n \n+/* Used in direct rearm mode */\n+extern bool enabled_direct_rearm;\n+extern uint8_t direct_rearm_entry_number;\n+extern bool queue_enabled_direct_rearm[RTE_MAX_ETHPORTS][MAX_DIRECT_REARM_QUEUE_PER_PORT];\n+extern uint16_t direct_rearm_map_tx_port[RTE_MAX_ETHPORTS][MAX_DIRECT_REARM_QUEUE_PER_PORT];\n+extern uint16_t direct_rearm_map_tx_queue[RTE_MAX_ETHPORTS][MAX_DIRECT_REARM_QUEUE_PER_PORT];\n+extern uint8_t direct_rearm_entry_idx[RTE_MAX_ETHPORTS][MAX_DIRECT_REARM_QUEUE_PER_PORT];\n+\n /* Send burst of packets on an output interface */\n static inline int\n send_burst(struct lcore_conf *qconf, uint16_t n, uint16_t port)\ndiff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c\nindex 22d7f61a42..973fe70aae 100644\n--- a/examples/l3fwd/l3fwd_lpm.c\n+++ b/examples/l3fwd/l3fwd_lpm.c\n@@ -150,6 +150,8 @@ lpm_main_loop(__rte_unused void *dummy)\n \tint i, nb_rx;\n \tuint16_t portid;\n \tuint8_t queueid;\n+\tuint8_t idx;\n+\tstruct rte_eth_txq_data txq_data[MAX_DIRECT_REARM_ENTRY_NUMBER];\n \tstruct lcore_conf *qconf;\n \tconst uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) /\n \t\tUS_PER_S * BURST_TX_DRAIN_US;\n@@ -175,6 +177,20 @@ lpm_main_loop(__rte_unused void *dummy)\n \t\t\tlcore_id, portid, queueid);\n \t}\n \n+\tif (enabled_direct_rearm) {\n+\t\tuint16_t tx_portid;\n+\t\tuint8_t tx_queueid;\n+\n+\t\tfor (i = 0; i < n_rx_q; i++) {\n+\t\t\tportid = qconf->rx_queue_list[i].port_id;\n+\t\t\tqueueid = qconf->rx_queue_list[i].queue_id;\n+\t\t\ttx_portid = direct_rearm_map_tx_port[portid][queueid];\n+\t\t\ttx_queueid = direct_rearm_map_tx_queue[portid][queueid];\n+\t\t\tidx = direct_rearm_entry_idx[portid][queueid];\n+\t\t\trte_eth_tx_queue_data_get(tx_portid, tx_queueid, &(txq_data[idx]));\n+\t\t}\n+\t}\n+\n \tcur_tsc = rte_rdtsc();\n \tprev_tsc = cur_tsc;\n \n@@ -205,6 +221,12 @@ lpm_main_loop(__rte_unused void *dummy)\n \t\tfor (i = 0; i < n_rx_q; ++i) {\n \t\t\tportid = qconf->rx_queue_list[i].port_id;\n \t\t\tqueueid = qconf->rx_queue_list[i].queue_id;\n+\n+\t\t\tif (queue_enabled_direct_rearm[portid][queueid]) {\n+\t\t\t\tidx = direct_rearm_entry_idx[portid][queueid];\n+\t\t\t\trte_eth_rx_direct_rearm(portid, queueid, &(txq_data[idx]));\n+\t\t\t}\n+\n \t\t\tnb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,\n \t\t\t\tMAX_PKT_BURST);\n \t\t\tif (nb_rx == 0)\ndiff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c\nindex e090328fcc..2e9c5c0dc4 100644\n--- a/examples/l3fwd/main.c\n+++ b/examples/l3fwd/main.c\n@@ -91,6 +91,20 @@ uint32_t enabled_port_mask;\n int ipv6; /**< ipv6 is false by default. */\n uint32_t hash_entry_number = HASH_ENTRY_NUMBER_DEFAULT;\n \n+/* Used for direct rearm mode */\n+bool enabled_direct_rearm;/**< Flag to enable direct rearm mode. */\n+uint8_t direct_rearm_entry_number; /**< Number of entry for direct rearm map. */\n+/**< Direct rearm config parameters. */\n+uint16_t direct_rearm_config[MAX_DIRECT_REARM_ENTRY_NUMBER][4];\n+/**< Enable direct rearm flag for Rx queue . */\n+bool queue_enabled_direct_rearm[RTE_MAX_ETHPORTS][MAX_DIRECT_REARM_QUEUE_PER_PORT];\n+/**< Matrix for Rx queue mapping Tx port in direct rearm mode. */\n+uint16_t direct_rearm_map_tx_port[RTE_MAX_ETHPORTS][MAX_DIRECT_REARM_QUEUE_PER_PORT];\n+/**< Matrix for Rx queue mapping Tx queue in direct rearm mode. */\n+uint16_t direct_rearm_map_tx_queue[RTE_MAX_ETHPORTS][MAX_DIRECT_REARM_QUEUE_PER_PORT];\n+/**< Matrix for Rx queue mapping entry idx in direct rearm mode. */\n+uint8_t direct_rearm_entry_idx[RTE_MAX_ETHPORTS][MAX_DIRECT_REARM_QUEUE_PER_PORT];\n+\n struct lcore_conf lcore_conf[RTE_MAX_LCORE];\n \n struct parm_cfg parm_config;\n@@ -403,6 +417,7 @@ print_usage(const char *prgname)\n \t\t\" [--mode]\"\n \t\t\" [--eventq-sched]\"\n \t\t\" [--event-vector [--event-vector-size SIZE] [--event-vector-tmo NS]]\"\n+\t\t\" --direct-rearm (rx_port, rx_queue, tx_port, tx_queue)[,(rx_port, rx_queue, tx_port, tx_queue)]\"\n \t\t\" [-E]\"\n \t\t\" [-L]\\n\\n\"\n \n@@ -436,6 +451,7 @@ print_usage(const char *prgname)\n \t\t\"  --event-vector:  Enable event vectorization.\\n\"\n \t\t\"  --event-vector-size: Max vector size if event vectorization is enabled.\\n\"\n \t\t\"  --event-vector-tmo: Max timeout to form vector in nanoseconds if event vectorization is enabled\\n\"\n+\t\t\"  --direct-rearm (rx_port, rx_queue, tx_port, tx_queue): Put Tx queue sw-ring buffers into Rx queue\\n\"\n \t\t\"  -E : Enable exact match, legacy flag please use --lookup=em instead\\n\"\n \t\t\"  -L : Enable longest prefix match, legacy flag please use --lookup=lpm instead\\n\"\n \t\t\"  --rule_ipv4=FILE: Specify the ipv4 rules entries file.\\n\"\n@@ -670,6 +686,53 @@ parse_lookup(const char *optarg)\n \treturn 0;\n }\n \n+static int\n+parse_direct_rearm(const char *q_arg)\n+{\n+\tchar s[256];\n+\tconst char *p, *p0 = q_arg;\n+\tchar *end;\n+\tenum fieldnames {\n+\t\tFLD_RX_PORT = 0,\n+\t\tFLD_RX_QUEUE,\n+\t\tFLD_TX_PORT,\n+\t\tFLD_TX_QUEUE,\n+\t\t_NUM_FLD\n+\t};\n+\tunsigned long int_fld[_NUM_FLD];\n+\tchar *str_fld[_NUM_FLD];\n+\tint i;\n+\tunsigned int size;\n+\n+\twhile ((p = strchr(p0, '(')) != NULL) {\n+\t\t++p;\n+\t\tp0 = strchr(p, ')');\n+\t\tif (p0 == NULL)\n+\t\t\treturn -1;\n+\n+\t\tsize = p0 - p;\n+\t\tif (size >= sizeof(s))\n+\t\t\treturn -1;\n+\n+\t\tsnprintf(s, sizeof(s), \"%.*s\", size, p);\n+\t\tif (rte_strsplit(s, sizeof(s), str_fld, _NUM_FLD, ',') != _NUM_FLD)\n+\t\t\treturn -1;\n+\t\tfor (i = 0; i < _NUM_FLD; i++) {\n+\t\t\terrno = 0;\n+\t\t\tint_fld[i] = strtoul(str_fld[i], &end, 0);\n+\t\t\tif (errno != 0 || end == str_fld[i] || int_fld[i] > 255)\n+\t\t\t\treturn -1;\n+\t\t}\n+\n+\t\tdirect_rearm_config[direct_rearm_entry_number][0] = int_fld[FLD_RX_PORT];\n+\t\tdirect_rearm_config[direct_rearm_entry_number][1] = int_fld[FLD_RX_QUEUE];\n+\t\tdirect_rearm_config[direct_rearm_entry_number][2] = int_fld[FLD_TX_PORT];\n+\t\tdirect_rearm_config[direct_rearm_entry_number][3] = int_fld[FLD_TX_QUEUE];\n+\t\t++direct_rearm_entry_number;\n+\t}\n+\treturn 0;\n+}\n+\n #define MAX_JUMBO_PKT_LEN  9600\n \n static const char short_options[] =\n@@ -696,6 +759,7 @@ static const char short_options[] =\n #define CMD_LINE_OPT_ENABLE_VECTOR \"event-vector\"\n #define CMD_LINE_OPT_VECTOR_SIZE \"event-vector-size\"\n #define CMD_LINE_OPT_VECTOR_TMO_NS \"event-vector-tmo\"\n+#define CMD_LINE_OPT_DIRECT_REARM \"direct-rearm\"\n #define CMD_LINE_OPT_RULE_IPV4 \"rule_ipv4\"\n #define CMD_LINE_OPT_RULE_IPV6 \"rule_ipv6\"\n #define CMD_LINE_OPT_ALG \"alg\"\n@@ -725,7 +789,8 @@ enum {\n \tCMD_LINE_OPT_LOOKUP_NUM,\n \tCMD_LINE_OPT_ENABLE_VECTOR_NUM,\n \tCMD_LINE_OPT_VECTOR_SIZE_NUM,\n-\tCMD_LINE_OPT_VECTOR_TMO_NS_NUM\n+\tCMD_LINE_OPT_VECTOR_TMO_NS_NUM,\n+\tCMD_LINE_OPT_DIRECT_REARM_NUM\n };\n \n static const struct option lgopts[] = {\n@@ -747,6 +812,7 @@ static const struct option lgopts[] = {\n \t{CMD_LINE_OPT_ENABLE_VECTOR, 0, 0, CMD_LINE_OPT_ENABLE_VECTOR_NUM},\n \t{CMD_LINE_OPT_VECTOR_SIZE, 1, 0, CMD_LINE_OPT_VECTOR_SIZE_NUM},\n \t{CMD_LINE_OPT_VECTOR_TMO_NS, 1, 0, CMD_LINE_OPT_VECTOR_TMO_NS_NUM},\n+\t{CMD_LINE_OPT_DIRECT_REARM, 1, 0, CMD_LINE_OPT_DIRECT_REARM_NUM},\n \t{CMD_LINE_OPT_RULE_IPV4,   1, 0, CMD_LINE_OPT_RULE_IPV4_NUM},\n \t{CMD_LINE_OPT_RULE_IPV6,   1, 0, CMD_LINE_OPT_RULE_IPV6_NUM},\n \t{CMD_LINE_OPT_ALG,   1, 0, CMD_LINE_OPT_ALG_NUM},\n@@ -912,6 +978,15 @@ parse_args(int argc, char **argv)\n \t\tcase CMD_LINE_OPT_VECTOR_TMO_NS_NUM:\n \t\t\tevt_rsrc->vector_tmo_ns = strtoull(optarg, NULL, 10);\n \t\t\tbreak;\n+\t\tcase CMD_LINE_OPT_DIRECT_REARM_NUM:\n+\t\t\tenabled_direct_rearm = 1;\n+\t\t\tret = parse_direct_rearm(optarg);\n+\t\t\tif (ret) {\n+\t\t\t\tfprintf(stderr, \"Invalid direct rearm map\\n\");\n+\t\t\t\tprint_usage(prgname);\n+\t\t\t\treturn -1;\n+\t\t\t\t}\n+\t\t\tbreak;\n \t\tcase CMD_LINE_OPT_RULE_IPV4_NUM:\n \t\t\tl3fwd_set_rule_ipv4_name(optarg);\n \t\t\tbreak;\n@@ -1594,6 +1669,23 @@ main(int argc, char **argv)\n \t\t}\n \t}\n \n+\tif (enabled_direct_rearm) {\n+\t\tuint16_t rx_port, tx_port;\n+\t\tuint8_t rx_queue, tx_queue;\n+\t\tuint8_t m = 0;\n+\t\twhile (m < direct_rearm_entry_number) {\n+\t\t\trx_port = direct_rearm_config[m][0];\n+\t\t\trx_queue = direct_rearm_config[m][1];\n+\t\t\ttx_port = direct_rearm_config[m][2];\n+\t\t\ttx_queue = direct_rearm_config[m][3];\n+\t\t\tqueue_enabled_direct_rearm[rx_port][rx_queue] = 1;\n+\t\t\tdirect_rearm_map_tx_port[rx_port][rx_queue] = tx_port;\n+\t\t\tdirect_rearm_map_tx_queue[rx_port][rx_queue] = tx_queue;\n+\t\t\tdirect_rearm_entry_idx[rx_port][rx_queue] = m;\n+\t\t\tm++;\n+\t\t}\n+\t}\n+\n \tcheck_all_ports_link_status(enabled_port_mask);\n \n \tret = 0;\n",
    "prefixes": [
        "v2",
        "3/3"
    ]
}