get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 97568,
    "url": "http://patches.dpdk.org/api/patches/97568/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/cff4456906f1775f28c0fceed63d4d640e853534.1630350680.git.sthotton@marvell.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": "<cff4456906f1775f28c0fceed63d4d640e853534.1630350680.git.sthotton@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/cff4456906f1775f28c0fceed63d4d640e853534.1630350680.git.sthotton@marvell.com",
    "date": "2021-08-30T19:15:17",
    "name": "examples/l3fwd: add changes to use event vector",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "baacc7b2d4d269b9fd17f967699b4ba1fc349b08",
    "submitter": {
        "id": 2049,
        "url": "http://patches.dpdk.org/api/people/2049/?format=api",
        "name": "Shijith Thotton",
        "email": "sthotton@marvell.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/cff4456906f1775f28c0fceed63d4d640e853534.1630350680.git.sthotton@marvell.com/mbox/",
    "series": [
        {
            "id": 18540,
            "url": "http://patches.dpdk.org/api/series/18540/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=18540",
            "date": "2021-08-30T19:15:17",
            "name": "examples/l3fwd: add changes to use event vector",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/18540/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/97568/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/97568/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 29D7DA0547;\n\tMon, 30 Aug 2021 21:16:04 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A575D410F3;\n\tMon, 30 Aug 2021 21:16:03 +0200 (CEST)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173])\n by mails.dpdk.org (Postfix) with ESMTP id A351340698\n for <dev@dpdk.org>; Mon, 30 Aug 2021 21:16:02 +0200 (CEST)",
            "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 17U9ZKYg011134\n for <dev@dpdk.org>; Mon, 30 Aug 2021 12:16:01 -0700",
            "from dc5-exch02.marvell.com ([199.233.59.182])\n by mx0b-0016f401.pphosted.com with ESMTP id 3arj9m3mrd-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT)\n for <dev@dpdk.org>; Mon, 30 Aug 2021 12:16:01 -0700",
            "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, 30 Aug 2021 12:15:59 -0700",
            "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.18 via Frontend\n Transport; Mon, 30 Aug 2021 12:15:58 -0700",
            "from localhost.localdomain (unknown [10.28.34.29])\n by maili.marvell.com (Postfix) with ESMTP id BFD343F7078;\n Mon, 30 Aug 2021 12:15:56 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : mime-version : content-transfer-encoding :\n content-type; s=pfpt0220; bh=itA2falOseLbVonGVEtMROjc9RGF5iDLuhUDGvHvSsM=;\n b=Wj/k2IfEMRLhS1439ghgW44X1SLjMqbYP2qom1oldqBl8MEjBVp9xdqichg2S1XkDsSl\n re6BZh3iXk3NyDwOBURHDHt0qy13iL5eWYlPMFIXdcqfmHLSb+p3igFcltwKybMxrgrn\n f1lNnvwdNiRBYelXZlzgdX5lPm3XZWEMUr6sLgqq2kziIm0rygBr+qXePoIEjQGTInWJ\n wpczJX6uQIqmiofJeFfB2dvwpxsbLOgUvoN/rIY2HXaW2ZOa2v3jHNXscV+CA9vnNONW\n 8c/4yKv1oJaALKHHEmyc+s7voJOx2Bp2ZkYgeODyN7TnCUPWkBfr8zZ9TVAyyQJpIO+U mQ==",
        "From": "Shijith Thotton <sthotton@marvell.com>",
        "To": "<dev@dpdk.org>",
        "CC": "Shijith Thotton <sthotton@marvell.com>, <jerinj@marvell.com>,\n <ndabilpuram@marvell.com>, <pbhagavatula@marvell.com>,\n <schalla@marvell.com>",
        "Date": "Tue, 31 Aug 2021 00:45:17 +0530",
        "Message-ID": "\n <cff4456906f1775f28c0fceed63d4d640e853534.1630350680.git.sthotton@marvell.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Proofpoint-GUID": "Qh1voWRL8uSY9T_QN8f3FN4GP2IyFx0w",
        "X-Proofpoint-ORIG-GUID": "Qh1voWRL8uSY9T_QN8f3FN4GP2IyFx0w",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.391,FMLib:17.0.607.475\n definitions=2021-08-30_06,2021-08-30_01,2020-04-07_01",
        "Subject": "[dpdk-dev] [PATCH] examples/l3fwd: add changes to use event vector",
        "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": "Added changes to receive packets as event vector. By default this is\ndisabled and can be enabled using the option --enable-vector. Vector\nsize and timeout to form the vector can be configured using options\n--vector-size and --vector-tmo-ns.\n\nExample:\n\tdpdk-l3fwd -l 0-3 -n 4 -- -p 0x03 --mode=eventdev \\\n\t--eventq-sched=ordered --enable-vector --vector-size 16\n\nSigned-off-by: Shijith Thotton <sthotton@marvell.com>\n---\nDepends-on: series=18322 (eventdev: simplify Rx adapter event vector config)\n\n doc/guides/sample_app_ug/l3_forward.rst    |   7 +\n examples/l3fwd/l3fwd.h                     |  26 ++++\n examples/l3fwd/l3fwd_em.c                  | 104 ++++++++++++++\n examples/l3fwd/l3fwd_em.h                  |  29 ++++\n examples/l3fwd/l3fwd_em_hlm.h              |  66 +++++++++\n examples/l3fwd/l3fwd_em_sequential.h       |  23 +++\n examples/l3fwd/l3fwd_event.c               |  57 +++++---\n examples/l3fwd/l3fwd_event.h               |  32 +++++\n examples/l3fwd/l3fwd_event_internal_port.c |  27 +++-\n examples/l3fwd/l3fwd_fib.c                 | 157 +++++++++++++++++++++\n examples/l3fwd/l3fwd_lpm.c                 | 113 +++++++++++++++\n examples/l3fwd/main.c                      |  58 ++++++++\n 12 files changed, 676 insertions(+), 23 deletions(-)",
    "diff": "diff --git a/doc/guides/sample_app_ug/l3_forward.rst b/doc/guides/sample_app_ug/l3_forward.rst\nindex 2d5cd5f1c0..e20f4a558d 100644\n--- a/doc/guides/sample_app_ug/l3_forward.rst\n+++ b/doc/guides/sample_app_ug/l3_forward.rst\n@@ -74,6 +74,7 @@ The application has a number of command line options::\n                              [--mode]\n                              [--eventq-sched]\n                              [--event-eth-rxqs]\n+                             [--enable-vector [--vector-size SIZE] [--vector-tmo-ns NS]]\"\n                              [-E]\n                              [-L]\n \n@@ -115,6 +116,12 @@ Where,\n \n * ``--event-eth-rxqs:`` Optional, Number of ethernet RX queues per device. Only valid if --mode=eventdev.\n \n+* ``--enable-vector:`` Optional, Enable event vectorization. Only valid if --mode=eventdev.\n+\n+* ``--vector-size:`` Optional, Max vector size if event vectorization is enabled.\n+\n+* ``--vector-tmo-ns:`` Optional, Max timeout to form vector in nanoseconds if event vectorization is enabled.\n+\n * ``-E:`` Optional, enable exact match,\n   legacy flag, please use ``--lookup=em`` instead.\n \ndiff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h\nindex a808d60247..9607ee0fbb 100644\n--- a/examples/l3fwd/l3fwd.h\n+++ b/examples/l3fwd/l3fwd.h\n@@ -28,6 +28,8 @@\n #define MEMPOOL_CACHE_SIZE 256\n #define MAX_RX_QUEUE_PER_LCORE 16\n \n+#define VECTOR_SIZE_DEFAULT   MAX_PKT_BURST\n+#define VECTOR_TMO_NS_DEFAULT 1E6 /* 1ms */\n /*\n  * Try to avoid TX buffering if we have at least MAX_TX_BURST packets to send.\n  */\n@@ -221,6 +223,14 @@ int\n lpm_event_main_loop_tx_q(__rte_unused void *dummy);\n int\n lpm_event_main_loop_tx_q_burst(__rte_unused void *dummy);\n+int\n+lpm_event_main_loop_tx_d_vector(__rte_unused void *dummy);\n+int\n+lpm_event_main_loop_tx_d_burst_vector(__rte_unused void *dummy);\n+int\n+lpm_event_main_loop_tx_q_vector(__rte_unused void *dummy);\n+int\n+lpm_event_main_loop_tx_q_burst_vector(__rte_unused void *dummy);\n \n int\n em_event_main_loop_tx_d(__rte_unused void *dummy);\n@@ -230,6 +240,14 @@ int\n em_event_main_loop_tx_q(__rte_unused void *dummy);\n int\n em_event_main_loop_tx_q_burst(__rte_unused void *dummy);\n+int\n+em_event_main_loop_tx_d_vector(__rte_unused void *dummy);\n+int\n+em_event_main_loop_tx_d_burst_vector(__rte_unused void *dummy);\n+int\n+em_event_main_loop_tx_q_vector(__rte_unused void *dummy);\n+int\n+em_event_main_loop_tx_q_burst_vector(__rte_unused void *dummy);\n \n int\n fib_event_main_loop_tx_d(__rte_unused void *dummy);\n@@ -239,6 +257,14 @@ int\n fib_event_main_loop_tx_q(__rte_unused void *dummy);\n int\n fib_event_main_loop_tx_q_burst(__rte_unused void *dummy);\n+int\n+fib_event_main_loop_tx_d_vector(__rte_unused void *dummy);\n+int\n+fib_event_main_loop_tx_d_burst_vector(__rte_unused void *dummy);\n+int\n+fib_event_main_loop_tx_q_vector(__rte_unused void *dummy);\n+int\n+fib_event_main_loop_tx_q_burst_vector(__rte_unused void *dummy);\n \n \n /* Return ipv4/ipv6 fwd lookup struct for LPM, EM or FIB. */\ndiff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c\nindex 2a8ab6aab5..4efa523cff 100644\n--- a/examples/l3fwd/l3fwd_em.c\n+++ b/examples/l3fwd/l3fwd_em.c\n@@ -878,6 +878,110 @@ em_event_main_loop_tx_q_burst(__rte_unused void *dummy)\n \treturn 0;\n }\n \n+/* Same eventdev loop for single and burst of vector */\n+static __rte_always_inline void\n+em_event_loop_vector(struct l3fwd_event_resources *evt_rsrc,\n+\t\t     const uint8_t flags)\n+{\n+\tconst int event_p_id = l3fwd_get_free_event_port(evt_rsrc);\n+\tconst uint8_t tx_q_id =\n+\t\tevt_rsrc->evq.event_q_id[evt_rsrc->evq.nb_queues - 1];\n+\tconst uint8_t event_d_id = evt_rsrc->event_d_id;\n+\tconst uint16_t deq_len = evt_rsrc->deq_depth;\n+\tstruct rte_event events[MAX_PKT_BURST];\n+\tstruct lcore_conf *lconf;\n+\tunsigned int lcore_id;\n+\tint i, nb_enq, nb_deq;\n+\n+\tif (event_p_id < 0)\n+\t\treturn;\n+\n+\tlcore_id = rte_lcore_id();\n+\tlconf = &lcore_conf[lcore_id];\n+\n+\tRTE_LOG(INFO, L3FWD, \"entering %s on lcore %u\\n\", __func__, lcore_id);\n+\n+\twhile (!force_quit) {\n+\t\t/* Read events from RX queues */\n+\t\tnb_deq = rte_event_dequeue_burst(event_d_id, event_p_id, events,\n+\t\t\t\t\t\t deq_len, 0);\n+\t\tif (nb_deq == 0) {\n+\t\t\trte_pause();\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tfor (i = 0; i < nb_deq; i++) {\n+\t\t\tif (flags & L3FWD_EVENT_TX_ENQ) {\n+\t\t\t\tevents[i].queue_id = tx_q_id;\n+\t\t\t\tevents[i].op = RTE_EVENT_OP_FORWARD;\n+\t\t\t}\n+\n+#if defined RTE_ARCH_X86 || defined __ARM_NEON\n+\t\t\tl3fwd_em_process_event_vector(events[i].vec, lconf);\n+#else\n+\t\t\tl3fwd_em_no_opt_process_event_vector(events[i].vec,\n+\t\t\t\t\t\t\t     lconf);\n+#endif\n+\t\t\tif (flags & L3FWD_EVENT_TX_DIRECT)\n+\t\t\t\tevent_vector_txq_set(events[i].vec, 0);\n+\t\t}\n+\n+\t\tif (flags & L3FWD_EVENT_TX_ENQ) {\n+\t\t\tnb_enq = rte_event_enqueue_burst(event_d_id, event_p_id,\n+\t\t\t\t\t\t\t events, nb_deq);\n+\t\t\twhile (nb_enq < nb_deq && !force_quit)\n+\t\t\t\tnb_enq += rte_event_enqueue_burst(event_d_id,\n+\t\t\t\t\t\tevent_p_id, events + nb_enq,\n+\t\t\t\t\t\tnb_deq - nb_enq);\n+\t\t}\n+\n+\t\tif (flags & L3FWD_EVENT_TX_DIRECT) {\n+\t\t\tnb_enq = rte_event_eth_tx_adapter_enqueue(event_d_id,\n+\t\t\t\t\t\tevent_p_id, events, nb_deq, 0);\n+\t\t\twhile (nb_enq < nb_deq && !force_quit)\n+\t\t\t\tnb_enq += rte_event_eth_tx_adapter_enqueue(\n+\t\t\t\t\tevent_d_id, event_p_id, events + nb_enq,\n+\t\t\t\t\tnb_deq - nb_enq, 0);\n+\t\t}\n+\t}\n+}\n+\n+int __rte_noinline\n+em_event_main_loop_tx_d_vector(__rte_unused void *dummy)\n+{\n+\tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n+\n+\tem_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_DIRECT);\n+\treturn 0;\n+}\n+\n+int __rte_noinline\n+em_event_main_loop_tx_d_burst_vector(__rte_unused void *dummy)\n+{\n+\tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n+\n+\tem_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_DIRECT);\n+\treturn 0;\n+}\n+\n+int __rte_noinline\n+em_event_main_loop_tx_q_vector(__rte_unused void *dummy)\n+{\n+\tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n+\n+\tem_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_ENQ);\n+\treturn 0;\n+}\n+\n+int __rte_noinline\n+em_event_main_loop_tx_q_burst_vector(__rte_unused void *dummy)\n+{\n+\tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n+\n+\tem_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_ENQ);\n+\treturn 0;\n+}\n+\n /* Initialize exact match (hash) parameters. 8< */\n void\n setup_hash(const int socketid)\ndiff --git a/examples/l3fwd/l3fwd_em.h b/examples/l3fwd/l3fwd_em.h\nindex b992a21da4..6c13b09bca 100644\n--- a/examples/l3fwd/l3fwd_em.h\n+++ b/examples/l3fwd/l3fwd_em.h\n@@ -175,4 +175,33 @@ l3fwd_em_no_opt_process_events(int nb_rx, struct rte_event **events,\n \t\tl3fwd_em_simple_process(events[j]->mbuf, qconf);\n }\n \n+static inline void\n+l3fwd_em_no_opt_process_event_vector(struct rte_event_vector *vec,\n+\t\t\t\t     struct lcore_conf *qconf)\n+{\n+\tint32_t i;\n+\n+\t/* Prefetch first packets */\n+\tfor (i = 0; i < PREFETCH_OFFSET && i < vec->nb_elem; i++)\n+\t\trte_prefetch0(rte_pktmbuf_mtod(vec->mbufs[i], void *));\n+\n+\tevent_vector_attr_init(vec, vec->mbufs[0]);\n+\n+\t/*\n+\t * Prefetch and forward already prefetched packets.\n+\t */\n+\tfor (i = 0; i < (vec->nb_elem - PREFETCH_OFFSET); i++) {\n+\t\trte_prefetch0(rte_pktmbuf_mtod(vec->mbufs[i + PREFETCH_OFFSET],\n+\t\t\t\t\t       void *));\n+\t\tl3fwd_em_simple_process(vec->mbufs[i], qconf);\n+\t\tevent_vector_attr_update(vec, vec->mbufs[i]);\n+\t}\n+\n+\t/* Forward remaining prefetched packets */\n+\tfor (; i < vec->nb_elem; i++) {\n+\t\tl3fwd_em_simple_process(vec->mbufs[i], qconf);\n+\t\tevent_vector_attr_update(vec, vec->mbufs[i]);\n+\t}\n+}\n+\n #endif /* __L3FWD_EM_H__ */\ndiff --git a/examples/l3fwd/l3fwd_em_hlm.h b/examples/l3fwd/l3fwd_em_hlm.h\nindex 278707c18c..537fa54871 100644\n--- a/examples/l3fwd/l3fwd_em_hlm.h\n+++ b/examples/l3fwd/l3fwd_em_hlm.h\n@@ -318,4 +318,70 @@ l3fwd_em_process_events(int nb_rx, struct rte_event **ev,\n \t\tprocess_packet(pkts_burst[j], &pkts_burst[j]->port);\n \t}\n }\n+\n+static inline void\n+l3fwd_em_process_event_vector(struct rte_event_vector *vec,\n+\t\t\t      struct lcore_conf *qconf)\n+{\n+\tint32_t i, j, n, pos;\n+\tuint16_t dst_port[MAX_PKT_BURST];\n+\n+\tfor (j = 0; j < EM_HASH_LOOKUP_COUNT && j < vec->nb_elem; j++)\n+\t\trte_prefetch0(rte_pktmbuf_mtod(vec->mbufs[j],\n+\t\t\t\t\t       struct rte_ether_hdr *) + 1);\n+\n+\tevent_vector_attr_init(vec, vec->mbufs[0]);\n+\tn = RTE_ALIGN_FLOOR(vec->nb_elem, EM_HASH_LOOKUP_COUNT);\n+\tfor (j = 0; j < n; j += EM_HASH_LOOKUP_COUNT) {\n+\t\tuint32_t pkt_type = RTE_PTYPE_L3_MASK |\n+\t\t\t\t    RTE_PTYPE_L4_TCP | RTE_PTYPE_L4_UDP;\n+\t\tuint32_t l3_type, tcp_or_udp;\n+\n+\t\tfor (i = 0; i < EM_HASH_LOOKUP_COUNT; i++)\n+\t\t\tpkt_type &= vec->mbufs[j + i]->packet_type;\n+\n+\t\tl3_type = pkt_type & RTE_PTYPE_L3_MASK;\n+\t\ttcp_or_udp = pkt_type & (RTE_PTYPE_L4_TCP | RTE_PTYPE_L4_UDP);\n+\n+\t\tfor (i = 0, pos = j + EM_HASH_LOOKUP_COUNT;\n+\t\t     i < EM_HASH_LOOKUP_COUNT && pos < vec->nb_elem;\n+\t\t     i++, pos++) {\n+\t\t\trte_prefetch0(rte_pktmbuf_mtod(vec->mbufs[pos],\n+\t\t\t\t\t       struct rte_ether_hdr *) + 1);\n+\t\t}\n+\n+\t\tif (tcp_or_udp && (l3_type == RTE_PTYPE_L3_IPV4)) {\n+\t\t\tem_get_dst_port_ipv4xN_events(qconf, &vec->mbufs[j],\n+\t\t\t\t\t\t      &dst_port[j]);\n+\t\t} else if (tcp_or_udp && (l3_type == RTE_PTYPE_L3_IPV6)) {\n+\t\t\tem_get_dst_port_ipv6xN_events(qconf, &vec->mbufs[j],\n+\t\t\t\t\t\t      &dst_port[j]);\n+\t\t} else {\n+\t\t\tfor (i = 0; i < EM_HASH_LOOKUP_COUNT; i++) {\n+\t\t\t\tvec->mbufs[j + i]->port = em_get_dst_port(\n+\t\t\t\t\tqconf, vec->mbufs[j + i],\n+\t\t\t\t\tvec->mbufs[j + i]->port);\n+\t\t\t\tprocess_packet(vec->mbufs[j + i],\n+\t\t\t\t\t       &vec->mbufs[j + i]->port);\n+\t\t\t\tevent_vector_attr_update(vec,\n+\t\t\t\t\t\t\t vec->mbufs[j + i]);\n+\t\t\t}\n+\t\t\tcontinue;\n+\t\t}\n+\t\tprocessx4_step3(&vec->mbufs[j], &dst_port[j]);\n+\n+\t\tfor (i = 0; i < EM_HASH_LOOKUP_COUNT; i++) {\n+\t\t\tvec->mbufs[j + i]->port = dst_port[j + i];\n+\t\t\tevent_vector_attr_update(vec, vec->mbufs[j + i]);\n+\t\t}\n+\t}\n+\n+\tfor (; j < vec->nb_elem; j++) {\n+\t\tvec->mbufs[j]->port = em_get_dst_port(qconf, vec->mbufs[j],\n+\t\t\t\t\t\t      vec->mbufs[j]->port);\n+\t\tprocess_packet(vec->mbufs[j], &vec->mbufs[j]->port);\n+\t\tevent_vector_attr_update(vec, vec->mbufs[j]);\n+\t}\n+}\n+\n #endif /* __L3FWD_EM_HLM_H__ */\ndiff --git a/examples/l3fwd/l3fwd_em_sequential.h b/examples/l3fwd/l3fwd_em_sequential.h\nindex 6170052cf8..3784058d3f 100644\n--- a/examples/l3fwd/l3fwd_em_sequential.h\n+++ b/examples/l3fwd/l3fwd_em_sequential.h\n@@ -121,4 +121,27 @@ l3fwd_em_process_events(int nb_rx, struct rte_event **events,\n \t\tprocess_packet(mbuf, &mbuf->port);\n \t}\n }\n+\n+static inline void\n+l3fwd_em_process_event_vector(struct rte_event_vector *vec,\n+\t\t\t      struct lcore_conf *qconf)\n+{\n+\tint32_t i, j;\n+\n+\trte_prefetch0(rte_pktmbuf_mtod(vec->mbufs[0],\n+\t\t\t\t       struct rte_ether_hdr *) + 1);\n+\tevent_vector_attr_init(vec, vec->mbufs[0]);\n+\n+\tfor (i = 0, j = 1; i < vec->nb_elem; i++, j++) {\n+\t\tstruct rte_mbuf *mbuf = vec->mbufs[i];\n+\n+\t\tif (j < vec->nb_elem)\n+\t\t\trte_prefetch0(rte_pktmbuf_mtod(vec->mbufs[j],\n+\t\t\t\t\t       struct rte_ether_hdr *) + 1);\n+\t\tmbuf->port = em_get_dst_port(qconf, mbuf, mbuf->port);\n+\t\tprocess_packet(mbuf, &mbuf->port);\n+\t\tevent_vector_attr_update(vec, mbuf);\n+\t}\n+}\n+\n #endif /* __L3FWD_EM_SEQUENTIAL_H__ */\ndiff --git a/examples/l3fwd/l3fwd_event.c b/examples/l3fwd/l3fwd_event.c\nindex 961860ea18..29172e590b 100644\n--- a/examples/l3fwd/l3fwd_event.c\n+++ b/examples/l3fwd/l3fwd_event.c\n@@ -215,23 +215,35 @@ void\n l3fwd_event_resource_setup(struct rte_eth_conf *port_conf)\n {\n \tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n-\tconst event_loop_cb lpm_event_loop[2][2] = {\n-\t\t[0][0] = lpm_event_main_loop_tx_d,\n-\t\t[0][1] = lpm_event_main_loop_tx_d_burst,\n-\t\t[1][0] = lpm_event_main_loop_tx_q,\n-\t\t[1][1] = lpm_event_main_loop_tx_q_burst,\n+\tconst event_loop_cb lpm_event_loop[2][2][2] = {\n+\t\t[0][0][0] = lpm_event_main_loop_tx_d,\n+\t\t[0][0][1] = lpm_event_main_loop_tx_d_burst,\n+\t\t[0][1][0] = lpm_event_main_loop_tx_q,\n+\t\t[0][1][1] = lpm_event_main_loop_tx_q_burst,\n+\t\t[1][0][0] = lpm_event_main_loop_tx_d_vector,\n+\t\t[1][0][1] = lpm_event_main_loop_tx_d_burst_vector,\n+\t\t[1][1][0] = lpm_event_main_loop_tx_q_vector,\n+\t\t[1][1][1] = lpm_event_main_loop_tx_q_burst_vector,\n \t};\n-\tconst event_loop_cb em_event_loop[2][2] = {\n-\t\t[0][0] = em_event_main_loop_tx_d,\n-\t\t[0][1] = em_event_main_loop_tx_d_burst,\n-\t\t[1][0] = em_event_main_loop_tx_q,\n-\t\t[1][1] = em_event_main_loop_tx_q_burst,\n+\tconst event_loop_cb em_event_loop[2][2][2] = {\n+\t\t[0][0][0] = em_event_main_loop_tx_d,\n+\t\t[0][0][1] = em_event_main_loop_tx_d_burst,\n+\t\t[0][1][0] = em_event_main_loop_tx_q,\n+\t\t[0][1][1] = em_event_main_loop_tx_q_burst,\n+\t\t[1][0][0] = em_event_main_loop_tx_d_vector,\n+\t\t[1][0][1] = em_event_main_loop_tx_d_burst_vector,\n+\t\t[1][1][0] = em_event_main_loop_tx_q_vector,\n+\t\t[1][1][1] = em_event_main_loop_tx_q_burst_vector,\n \t};\n-\tconst event_loop_cb fib_event_loop[2][2] = {\n-\t\t[0][0] = fib_event_main_loop_tx_d,\n-\t\t[0][1] = fib_event_main_loop_tx_d_burst,\n-\t\t[1][0] = fib_event_main_loop_tx_q,\n-\t\t[1][1] = fib_event_main_loop_tx_q_burst,\n+\tconst event_loop_cb fib_event_loop[2][2][2] = {\n+\t\t[0][0][0] = fib_event_main_loop_tx_d,\n+\t\t[0][0][1] = fib_event_main_loop_tx_d_burst,\n+\t\t[0][1][0] = fib_event_main_loop_tx_q,\n+\t\t[0][1][1] = fib_event_main_loop_tx_q_burst,\n+\t\t[1][0][0] = fib_event_main_loop_tx_d_vector,\n+\t\t[1][0][1] = fib_event_main_loop_tx_d_burst_vector,\n+\t\t[1][1][0] = fib_event_main_loop_tx_q_vector,\n+\t\t[1][1][1] = fib_event_main_loop_tx_q_burst_vector,\n \t};\n \tuint32_t event_queue_cfg;\n \tint ret;\n@@ -265,12 +277,15 @@ l3fwd_event_resource_setup(struct rte_eth_conf *port_conf)\n \tif (ret < 0)\n \t\trte_exit(EXIT_FAILURE, \"Error in starting eventdev\");\n \n-\tevt_rsrc->ops.lpm_event_loop = lpm_event_loop[evt_rsrc->tx_mode_q]\n-\t\t\t\t\t\t       [evt_rsrc->has_burst];\n+\tevt_rsrc->ops.lpm_event_loop =\n+\t\tlpm_event_loop[evt_rsrc->vector_enabled][evt_rsrc->tx_mode_q]\n+\t\t\t      [evt_rsrc->has_burst];\n \n-\tevt_rsrc->ops.em_event_loop = em_event_loop[evt_rsrc->tx_mode_q]\n-\t\t\t\t\t\t       [evt_rsrc->has_burst];\n+\tevt_rsrc->ops.em_event_loop =\n+\t\tem_event_loop[evt_rsrc->vector_enabled][evt_rsrc->tx_mode_q]\n+\t\t\t     [evt_rsrc->has_burst];\n \n-\tevt_rsrc->ops.fib_event_loop = fib_event_loop[evt_rsrc->tx_mode_q]\n-\t\t\t\t\t\t       [evt_rsrc->has_burst];\n+\tevt_rsrc->ops.fib_event_loop =\n+\t\tfib_event_loop[evt_rsrc->vector_enabled][evt_rsrc->tx_mode_q]\n+\t\t\t      [evt_rsrc->has_burst];\n }\ndiff --git a/examples/l3fwd/l3fwd_event.h b/examples/l3fwd/l3fwd_event.h\nindex 3ad1902ab5..a15a369943 100644\n--- a/examples/l3fwd/l3fwd_event.h\n+++ b/examples/l3fwd/l3fwd_event.h\n@@ -65,6 +65,7 @@ struct l3fwd_event_resources {\n \tuint8_t disable_implicit_release;\n \tstruct l3fwd_event_setup_ops ops;\n \tstruct rte_mempool * (*pkt_pool)[NB_SOCKETS];\n+\tstruct rte_mempool **vec_pool;\n \tstruct l3fwd_event_queues evq;\n \tstruct l3fwd_event_ports evp;\n \tuint32_t port_mask;\n@@ -76,8 +77,39 @@ struct l3fwd_event_resources {\n \tuint8_t has_burst;\n \tuint8_t enabled;\n \tuint8_t eth_rx_queues;\n+\tuint8_t vector_enabled;\n+\tuint16_t vector_size;\n+\tuint64_t vector_tmo_ns;\n };\n \n+static inline void\n+event_vector_attr_init(struct rte_event_vector *vec, struct rte_mbuf *mbuf)\n+{\n+\tvec->attr_valid = 1;\n+\tvec->port = mbuf->port;\n+\tvec->queue = rte_event_eth_tx_adapter_txq_get(mbuf);\n+}\n+\n+static inline void\n+event_vector_attr_update(struct rte_event_vector *vec, struct rte_mbuf *mbuf)\n+{\n+\tif (vec->attr_valid && (vec->port != mbuf->port))\n+\t\tvec->attr_valid = 0;\n+}\n+\n+static inline void\n+event_vector_txq_set(struct rte_event_vector *vec, uint16_t txq)\n+{\n+\tint i;\n+\n+\tif (vec->attr_valid)\n+\t\tvec->queue = txq;\n+\n+\tfor (i = 0; i < vec->nb_elem; i++)\n+\t\trte_event_eth_tx_adapter_txq_set(vec->mbufs[i], txq);\n+\n+}\n+\n struct l3fwd_event_resources *l3fwd_get_eventdev_rsrc(void);\n void l3fwd_event_resource_setup(struct rte_eth_conf *port_conf);\n int l3fwd_get_free_event_port(struct l3fwd_event_resources *eventdev_rsrc);\ndiff --git a/examples/l3fwd/l3fwd_event_internal_port.c b/examples/l3fwd/l3fwd_event_internal_port.c\nindex 9916a7f556..bb681e0d5a 100644\n--- a/examples/l3fwd/l3fwd_event_internal_port.c\n+++ b/examples/l3fwd/l3fwd_event_internal_port.c\n@@ -215,12 +215,35 @@ l3fwd_rx_tx_adapter_setup_internal_port(void)\n \t\trte_panic(\"Failed to allocate memory for Rx adapter\\n\");\n \t}\n \n-\n \tRTE_ETH_FOREACH_DEV(port_id) {\n \t\tif ((evt_rsrc->port_mask & (1 << port_id)) == 0)\n \t\t\tcontinue;\n+\n+\t\tif (evt_rsrc->vector_enabled) {\n+\t\t\tuint32_t cap;\n+\n+\t\t\tif (rte_event_eth_rx_adapter_caps_get(event_d_id,\n+\t\t\t\t\t\t\t      port_id, &cap))\n+\t\t\t\trte_panic(\n+\t\t\t\t\t\"Failed to get event rx adapter capability\");\n+\n+\t\t\tif (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {\n+\t\t\t\teth_q_conf.vector_sz = evt_rsrc->vector_size;\n+\t\t\t\teth_q_conf.vector_timeout_ns =\n+\t\t\t\t\t\t\tevt_rsrc->vector_tmo_ns;\n+\t\t\t\teth_q_conf.vector_mp = evt_rsrc->per_port_pool ?\n+\t\t\t\t\t\tevt_rsrc->vec_pool[port_id] :\n+\t\t\t\t\t\tevt_rsrc->vec_pool[0];\n+\t\t\t\teth_q_conf.rx_queue_flags |=\n+\t\t\t\tRTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR;\n+\t\t\t} else {\n+\t\t\t\trte_panic(\n+\t\t\t\t\t\"Rx adapter doesn't support event vector\");\n+\t\t\t}\n+\t\t}\n+\n \t\tret = rte_event_eth_rx_adapter_create(adapter_id, event_d_id,\n-\t\t\t\t\t\t&evt_rsrc->def_p_conf);\n+\t\t\t\t\t\t      &evt_rsrc->def_p_conf);\n \t\tif (ret)\n \t\t\trte_panic(\"Failed to create rx adapter[%d]\\n\",\n \t\t\t\t  adapter_id);\ndiff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c\nindex f8d6a3ac39..e57f0c108f 100644\n--- a/examples/l3fwd/l3fwd_fib.c\n+++ b/examples/l3fwd/l3fwd_fib.c\n@@ -412,6 +412,163 @@ fib_event_main_loop_tx_q_burst(__rte_unused void *dummy)\n \treturn 0;\n }\n \n+static __rte_always_inline void\n+fib_process_event_vector(struct rte_event_vector *vec)\n+{\n+\tuint8_t ipv6_arr[MAX_PKT_BURST][RTE_FIB6_IPV6_ADDR_SIZE];\n+\tuint64_t hopsv4[MAX_PKT_BURST], hopsv6[MAX_PKT_BURST];\n+\tuint32_t ipv4_arr_assem, ipv6_arr_assem;\n+\tuint32_t ipv4_arr[MAX_PKT_BURST];\n+\tuint8_t type_arr[MAX_PKT_BURST];\n+\tuint32_t ipv4_cnt, ipv6_cnt;\n+\tstruct lcore_conf *lconf;\n+\tuint16_t nh;\n+\tint i;\n+\n+\tlconf = &lcore_conf[rte_lcore_id()];\n+\n+\t/* Reset counters. */\n+\tipv4_cnt = 0;\n+\tipv6_cnt = 0;\n+\tipv4_arr_assem = 0;\n+\tipv6_arr_assem = 0;\n+\n+\t/* Prefetch first packets. */\n+\tfor (i = 0; i < FIB_PREFETCH_OFFSET && i < vec->nb_elem; i++)\n+\t\trte_prefetch0(rte_pktmbuf_mtod(vec->mbufs[i], void *));\n+\n+\tevent_vector_attr_init(vec, vec->mbufs[0]);\n+\n+\t/* Parse packet info and prefetch. */\n+\tfor (i = 0; i < (vec->nb_elem - FIB_PREFETCH_OFFSET); i++) {\n+\t\trte_prefetch0(rte_pktmbuf_mtod(\n+\t\t\tvec->mbufs[i + FIB_PREFETCH_OFFSET], void *));\n+\t\tfib_parse_packet(vec->mbufs[i], &ipv4_arr[ipv4_cnt], &ipv4_cnt,\n+\t\t\t\t ipv6_arr[ipv6_cnt], &ipv6_cnt, &type_arr[i]);\n+\t}\n+\n+\t/* Parse remaining packet info. */\n+\tfor (; i < vec->nb_elem; i++)\n+\t\tfib_parse_packet(vec->mbufs[i], &ipv4_arr[ipv4_cnt], &ipv4_cnt,\n+\t\t\t\t ipv6_arr[ipv6_cnt], &ipv6_cnt, &type_arr[i]);\n+\n+\t/* Lookup IPv4 hops if IPv4 packets are present. */\n+\tif (likely(ipv4_cnt > 0))\n+\t\trte_fib_lookup_bulk(lconf->ipv4_lookup_struct, ipv4_arr, hopsv4,\n+\t\t\t\t    ipv4_cnt);\n+\n+\t/* Lookup IPv6 hops if IPv6 packets are present. */\n+\tif (ipv6_cnt > 0)\n+\t\trte_fib6_lookup_bulk(lconf->ipv6_lookup_struct, ipv6_arr,\n+\t\t\t\t     hopsv6, ipv6_cnt);\n+\n+\t/* Assign ports looked up in fib depending on IPv4 or IPv6 */\n+\tfor (i = 0; i < vec->nb_elem; i++) {\n+\t\tif (type_arr[i])\n+\t\t\tnh = (uint16_t)hopsv4[ipv4_arr_assem++];\n+\t\telse\n+\t\t\tnh = (uint16_t)hopsv6[ipv6_arr_assem++];\n+\t\tif (nh != FIB_DEFAULT_HOP)\n+\t\t\tvec->mbufs[i]->port = nh;\n+\t\tevent_vector_attr_update(vec, vec->mbufs[i]);\n+\t}\n+}\n+\n+static __rte_always_inline void\n+fib_event_loop_vector(struct l3fwd_event_resources *evt_rsrc,\n+\t\t      const uint8_t flags)\n+{\n+\tconst int event_p_id = l3fwd_get_free_event_port(evt_rsrc);\n+\tconst uint8_t tx_q_id =\n+\t\tevt_rsrc->evq.event_q_id[evt_rsrc->evq.nb_queues - 1];\n+\tconst uint8_t event_d_id = evt_rsrc->event_d_id;\n+\tconst uint16_t deq_len = evt_rsrc->deq_depth;\n+\tstruct rte_event events[MAX_PKT_BURST];\n+\tint nb_enq, nb_deq, i;\n+\n+\tif (event_p_id < 0)\n+\t\treturn;\n+\n+\tRTE_LOG(INFO, L3FWD, \"entering %s on lcore %u\\n\", __func__,\n+\t\trte_lcore_id());\n+\n+\twhile (!force_quit) {\n+\t\t/* Read events from RX queues. */\n+\t\tnb_deq = rte_event_dequeue_burst(event_d_id, event_p_id, events,\n+\t\t\t\t\t\t deq_len, 0);\n+\t\tif (nb_deq == 0) {\n+\t\t\trte_pause();\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tfor (i = 0; i < nb_deq; i++) {\n+\t\t\tif (flags & L3FWD_EVENT_TX_ENQ) {\n+\t\t\t\tevents[i].queue_id = tx_q_id;\n+\t\t\t\tevents[i].op = RTE_EVENT_OP_FORWARD;\n+\t\t\t}\n+\n+\t\t\tfib_process_event_vector(events[i].vec);\n+\n+\t\t\tif (flags & L3FWD_EVENT_TX_DIRECT)\n+\t\t\t\tevent_vector_txq_set(events[i].vec, 0);\n+\t\t}\n+\n+\t\tif (flags & L3FWD_EVENT_TX_ENQ) {\n+\t\t\tnb_enq = rte_event_enqueue_burst(event_d_id, event_p_id,\n+\t\t\t\t\t\t\t events, nb_deq);\n+\t\t\twhile (nb_enq < nb_deq && !force_quit)\n+\t\t\t\tnb_enq += rte_event_enqueue_burst(event_d_id,\n+\t\t\t\t\t\tevent_p_id, events + nb_enq,\n+\t\t\t\t\t\tnb_deq - nb_enq);\n+\t\t}\n+\n+\t\tif (flags & L3FWD_EVENT_TX_DIRECT) {\n+\t\t\tnb_enq = rte_event_eth_tx_adapter_enqueue(event_d_id,\n+\t\t\t\t\t\tevent_p_id, events, nb_deq, 0);\n+\t\t\twhile (nb_enq < nb_deq && !force_quit)\n+\t\t\t\tnb_enq += rte_event_eth_tx_adapter_enqueue(\n+\t\t\t\t\tevent_d_id, event_p_id, events + nb_enq,\n+\t\t\t\t\tnb_deq - nb_enq, 0);\n+\t\t}\n+\t}\n+}\n+\n+int __rte_noinline\n+fib_event_main_loop_tx_d_vector(__rte_unused void *dummy)\n+{\n+\tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n+\n+\tfib_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_DIRECT);\n+\treturn 0;\n+}\n+\n+int __rte_noinline\n+fib_event_main_loop_tx_d_burst_vector(__rte_unused void *dummy)\n+{\n+\tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n+\n+\tfib_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_DIRECT);\n+\treturn 0;\n+}\n+\n+int __rte_noinline\n+fib_event_main_loop_tx_q_vector(__rte_unused void *dummy)\n+{\n+\tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n+\n+\tfib_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_ENQ);\n+\treturn 0;\n+}\n+\n+int __rte_noinline\n+fib_event_main_loop_tx_q_burst_vector(__rte_unused void *dummy)\n+{\n+\tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n+\n+\tfib_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_ENQ);\n+\treturn 0;\n+}\n+\n /* Function to setup fib. 8< */\n void\n setup_fib(const int socketid)\ndiff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c\nindex 7200160164..60e7a4df72 100644\n--- a/examples/l3fwd/l3fwd_lpm.c\n+++ b/examples/l3fwd/l3fwd_lpm.c\n@@ -427,6 +427,119 @@ lpm_event_main_loop_tx_q_burst(__rte_unused void *dummy)\n \treturn 0;\n }\n \n+static __rte_always_inline void\n+lpm_process_event_vector(struct rte_event_vector *vec, struct lcore_conf *lconf)\n+{\n+\tint i;\n+\n+\tevent_vector_attr_init(vec, vec->mbufs[0]);\n+\n+\tfor (i = 0; i < vec->nb_elem; i++) {\n+\t\tlpm_process_event_pkt(lconf, vec->mbufs[i]);\n+\t\tevent_vector_attr_update(vec, vec->mbufs[i]);\n+\t}\n+}\n+\n+/* Same eventdev loop for single and burst of vector */\n+static __rte_always_inline void\n+lpm_event_loop_vector(struct l3fwd_event_resources *evt_rsrc,\n+\t\t      const uint8_t flags)\n+{\n+\tconst int event_p_id = l3fwd_get_free_event_port(evt_rsrc);\n+\tconst uint8_t tx_q_id =\n+\t\tevt_rsrc->evq.event_q_id[evt_rsrc->evq.nb_queues - 1];\n+\tconst uint8_t event_d_id = evt_rsrc->event_d_id;\n+\tconst uint16_t deq_len = evt_rsrc->deq_depth;\n+\tstruct rte_event events[MAX_PKT_BURST];\n+\tstruct lcore_conf *lconf;\n+\tunsigned int lcore_id;\n+\tint i, nb_enq, nb_deq;\n+\n+\tif (event_p_id < 0)\n+\t\treturn;\n+\n+\tlcore_id = rte_lcore_id();\n+\tlconf = &lcore_conf[lcore_id];\n+\n+\tRTE_LOG(INFO, L3FWD, \"entering %s on lcore %u\\n\", __func__, lcore_id);\n+\n+\twhile (!force_quit) {\n+\t\t/* Read events from RX queues */\n+\t\tnb_deq = rte_event_dequeue_burst(event_d_id, event_p_id, events,\n+\t\t\t\t\t\t deq_len, 0);\n+\t\tif (nb_deq == 0) {\n+\t\t\trte_pause();\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tfor (i = 0; i < nb_deq; i++) {\n+\t\t\tif (flags & L3FWD_EVENT_TX_ENQ) {\n+\t\t\t\tevents[i].queue_id = tx_q_id;\n+\t\t\t\tevents[i].op = RTE_EVENT_OP_FORWARD;\n+\t\t\t}\n+\n+\t\t\tlpm_process_event_vector(events[i].vec, lconf);\n+\n+\t\t\tif (flags & L3FWD_EVENT_TX_DIRECT)\n+\t\t\t\tevent_vector_txq_set(events[i].vec, 0);\n+\t\t}\n+\n+\t\tif (flags & L3FWD_EVENT_TX_ENQ) {\n+\t\t\tnb_enq = rte_event_enqueue_burst(event_d_id, event_p_id,\n+\t\t\t\t\t\t\t events, nb_deq);\n+\t\t\twhile (nb_enq < nb_deq && !force_quit)\n+\t\t\t\tnb_enq += rte_event_enqueue_burst(event_d_id,\n+\t\t\t\t\t\tevent_p_id, events + nb_enq,\n+\t\t\t\t\t\tnb_deq - nb_enq);\n+\t\t}\n+\n+\t\tif (flags & L3FWD_EVENT_TX_DIRECT) {\n+\t\t\tnb_enq = rte_event_eth_tx_adapter_enqueue(event_d_id,\n+\t\t\t\t\t\tevent_p_id, events, nb_deq, 0);\n+\t\t\twhile (nb_enq < nb_deq && !force_quit)\n+\t\t\t\tnb_enq += rte_event_eth_tx_adapter_enqueue(\n+\t\t\t\t\tevent_d_id, event_p_id, events + nb_enq,\n+\t\t\t\t\tnb_deq - nb_enq, 0);\n+\t\t}\n+\t}\n+}\n+\n+int __rte_noinline\n+lpm_event_main_loop_tx_d_vector(__rte_unused void *dummy)\n+{\n+\tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n+\n+\tlpm_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_DIRECT);\n+\treturn 0;\n+}\n+\n+int __rte_noinline\n+lpm_event_main_loop_tx_d_burst_vector(__rte_unused void *dummy)\n+{\n+\tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n+\n+\tlpm_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_DIRECT);\n+\treturn 0;\n+}\n+\n+int __rte_noinline\n+lpm_event_main_loop_tx_q_vector(__rte_unused void *dummy)\n+{\n+\tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n+\n+\tlpm_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_ENQ);\n+\treturn 0;\n+}\n+\n+int __rte_noinline\n+lpm_event_main_loop_tx_q_burst_vector(__rte_unused void *dummy)\n+{\n+\tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n+\n+\tlpm_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_ENQ);\n+\treturn 0;\n+}\n+\n void\n setup_lpm(const int socketid)\n {\ndiff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c\nindex 00ac267af1..7382a557aa 100644\n--- a/examples/l3fwd/main.c\n+++ b/examples/l3fwd/main.c\n@@ -137,6 +137,7 @@ static struct rte_eth_conf port_conf = {\n };\n \n static struct rte_mempool *pktmbuf_pool[RTE_MAX_ETHPORTS][NB_SOCKETS];\n+static struct rte_mempool *vector_pool[RTE_MAX_ETHPORTS];\n static uint8_t lkp_per_socket[NB_SOCKETS];\n \n struct l3fwd_lkp_mode {\n@@ -334,6 +335,7 @@ print_usage(const char *prgname)\n \t\t\" [--per-port-pool]\"\n \t\t\" [--mode]\"\n \t\t\" [--eventq-sched]\"\n+\t\t\" [--enable-vector [--vector-size SIZE] [--vector-tmo-ns NS]]\"\n \t\t\" [-E]\"\n \t\t\" [-L]\\n\\n\"\n \n@@ -361,6 +363,9 @@ print_usage(const char *prgname)\n \t\t\"  --event-eth-rxqs: Number of ethernet RX queues per device.\\n\"\n \t\t\"                    Default: 1\\n\"\n \t\t\"                    Valid only if --mode=eventdev\\n\"\n+\t\t\"  --enable-vector:  Enable event vectorization.\\n\"\n+\t\t\"  --vector-size: Max vector size if event vectorization is enabled.\\n\"\n+\t\t\"  --vector-tmo-ns: Max timeout to form vector in nanoseconds if event vectorization is enabled\\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\",\n \t\tprgname);\n@@ -574,6 +579,10 @@ static const char short_options[] =\n #define CMD_LINE_OPT_EVENTQ_SYNC \"eventq-sched\"\n #define CMD_LINE_OPT_EVENT_ETH_RX_QUEUES \"event-eth-rxqs\"\n #define CMD_LINE_OPT_LOOKUP \"lookup\"\n+#define CMD_LINE_OPT_ENABLE_VECTOR \"enable-vector\"\n+#define CMD_LINE_OPT_VECTOR_SIZE \"vector-size\"\n+#define CMD_LINE_OPT_VECTOR_TMO_NS \"vector-tmo-ns\"\n+\n enum {\n \t/* long options mapped to a short option */\n \n@@ -592,6 +601,9 @@ enum {\n \tCMD_LINE_OPT_EVENTQ_SYNC_NUM,\n \tCMD_LINE_OPT_EVENT_ETH_RX_QUEUES_NUM,\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 };\n \n static const struct option lgopts[] = {\n@@ -608,6 +620,9 @@ static const struct option lgopts[] = {\n \t{CMD_LINE_OPT_EVENT_ETH_RX_QUEUES, 1, 0,\n \t\t\t\t\tCMD_LINE_OPT_EVENT_ETH_RX_QUEUES_NUM},\n \t{CMD_LINE_OPT_LOOKUP, 1, 0, CMD_LINE_OPT_LOOKUP_NUM},\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{NULL, 0, 0, 0}\n };\n \n@@ -774,6 +789,16 @@ parse_args(int argc, char **argv)\n \t\t\t\treturn -1;\n \t\t\tbreak;\n \n+\t\tcase CMD_LINE_OPT_ENABLE_VECTOR_NUM:\n+\t\t\tprintf(\"event vectorization is enabled\\n\");\n+\t\t\tevt_rsrc->vector_enabled = 1;\n+\t\t\tbreak;\n+\t\tcase CMD_LINE_OPT_VECTOR_SIZE_NUM:\n+\t\t\tevt_rsrc->vector_size = strtol(optarg, NULL, 10);\n+\t\t\tbreak;\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\tdefault:\n \t\t\tprint_usage(prgname);\n \t\t\treturn -1;\n@@ -795,6 +820,19 @@ parse_args(int argc, char **argv)\n \t\treturn -1;\n \t}\n \n+\tif (evt_rsrc->vector_enabled && !evt_rsrc->vector_size) {\n+\t\tevt_rsrc->vector_size = VECTOR_SIZE_DEFAULT;\n+\t\tfprintf(stderr, \"vector size set to default (%\" PRIu16 \")\\n\",\n+\t\t\tevt_rsrc->vector_size);\n+\t}\n+\n+\tif (evt_rsrc->vector_enabled && !evt_rsrc->vector_tmo_ns) {\n+\t\tevt_rsrc->vector_tmo_ns = VECTOR_TMO_NS_DEFAULT;\n+\t\tfprintf(stderr,\n+\t\t\t\"vector timeout set to default (%\" PRIu64 \" ns)\\n\",\n+\t\t\tevt_rsrc->vector_tmo_ns);\n+\t}\n+\n \t/*\n \t * Nothing is selected, pick longest-prefix match\n \t * as default match.\n@@ -833,6 +871,7 @@ print_ethaddr(const char *name, const struct rte_ether_addr *eth_addr)\n int\n init_mem(uint16_t portid, unsigned int nb_mbuf)\n {\n+\tstruct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();\n \tstruct lcore_conf *qconf;\n \tint socketid;\n \tunsigned lcore_id;\n@@ -876,6 +915,24 @@ init_mem(uint16_t portid, unsigned int nb_mbuf)\n \t\t\t\tlkp_per_socket[socketid] = 1;\n \t\t\t}\n \t\t}\n+\n+\t\tif (evt_rsrc->vector_enabled && vector_pool[portid] == NULL) {\n+\t\t\tunsigned int nb_vec;\n+\n+\t\t\tnb_vec = (nb_mbuf + evt_rsrc->vector_size - 1) /\n+\t\t\t\t evt_rsrc->vector_size;\n+\t\t\tsnprintf(s, sizeof(s), \"vector_pool_%d\", portid);\n+\t\t\tvector_pool[portid] = rte_event_vector_pool_create(\n+\t\t\t\ts, nb_vec, 0, evt_rsrc->vector_size, socketid);\n+\t\t\tif (vector_pool[portid] == NULL)\n+\t\t\t\trte_exit(EXIT_FAILURE,\n+\t\t\t\t\t \"Failed to create vector pool for port %d\\n\",\n+\t\t\t\t\t portid);\n+\t\t\telse\n+\t\t\t\tprintf(\"Allocated vector pool for port %d\\n\",\n+\t\t\t\t       portid);\n+\t\t}\n+\n \t\tqconf = &lcore_conf[lcore_id];\n \t\tqconf->ipv4_lookup_struct =\n \t\t\tl3fwd_lkp.get_ipv4_lookup_struct(socketid);\n@@ -1307,6 +1364,7 @@ main(int argc, char **argv)\n \n \tevt_rsrc->per_port_pool = per_port_pool;\n \tevt_rsrc->pkt_pool = pktmbuf_pool;\n+\tevt_rsrc->vec_pool = vector_pool;\n \tevt_rsrc->port_mask = enabled_port_mask;\n \t/* Configure eventdev parameters if user has requested */\n \tif (evt_rsrc->enabled) {\n",
    "prefixes": []
}