get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 139806,
    "url": "http://patches.dpdk.org/api/patches/139806/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240502152816.65562-3-konstantin.v.ananyev@yandex.ru/",
    "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": "<20240502152816.65562-3-konstantin.v.ananyev@yandex.ru>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240502152816.65562-3-konstantin.v.ananyev@yandex.ru",
    "date": "2024-05-02T15:28:16",
    "name": "[2/2] examples/l3fwd: avoid packets reorder in ACL mode",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "4e53fb7b1460e8f454fccd48a99c0ef817485f89",
    "submitter": {
        "id": 2660,
        "url": "http://patches.dpdk.org/api/people/2660/?format=api",
        "name": "Konstantin Ananyev",
        "email": "konstantin.v.ananyev@yandex.ru"
    },
    "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/20240502152816.65562-3-konstantin.v.ananyev@yandex.ru/mbox/",
    "series": [
        {
            "id": 31868,
            "url": "http://patches.dpdk.org/api/series/31868/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=31868",
            "date": "2024-05-02T15:28:14",
            "name": "examples/l3fwd: ACL mode fixups and improvements",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/31868/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/139806/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/139806/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 DC74243F69;\n\tThu,  2 May 2024 17:29:07 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A495B402EB;\n\tThu,  2 May 2024 17:29:02 +0200 (CEST)",
            "from forward500b.mail.yandex.net (forward500b.mail.yandex.net\n [178.154.239.144])\n by mails.dpdk.org (Postfix) with ESMTP id 715EE402EA\n for <dev@dpdk.org>; Thu,  2 May 2024 17:29:00 +0200 (CEST)",
            "from mail-nwsmtp-smtp-production-main-37.myt.yp-c.yandex.net\n (mail-nwsmtp-smtp-production-main-37.myt.yp-c.yandex.net\n [IPv6:2a02:6b8:c12:1a4:0:640:b6:0])\n by forward500b.mail.yandex.net (Yandex) with ESMTPS id B875661172;\n Thu,  2 May 2024 18:28:59 +0300 (MSK)",
            "by mail-nwsmtp-smtp-production-main-37.myt.yp-c.yandex.net\n (smtp/Yandex) with ESMTPSA id bSVvo2YOeuQ0-lEzH3CpT;\n Thu, 02 May 2024 18:28:59 +0300"
        ],
        "X-Yandex-Fwd": "1",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail;\n t=1714663739; bh=Vvj4KGXcme3XerKhGKN835pU5tY3dH4WX+Xofk7aDJg=;\n h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From;\n b=vH/nENlkejnyDVlZNRfF1U+MLSCV4ZqB5y6NqzyVc/4ggvxQ3B6cNBkgttoQTkTQX\n ElVvM8WAAYO0hM/8qLnDTUw+ObswjJWtbTARQ7ZVq4o+DM9dYJrSHAiKXhrm8uUbJ8\n WrPGWFdZPSJvKvWMBkXMGxMGTAVolWho06L+Xxso=",
        "Authentication-Results": "\n mail-nwsmtp-smtp-production-main-37.myt.yp-c.yandex.net;\n dkim=pass header.i=@yandex.ru",
        "From": "Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>",
        "To": "dev@dpdk.org",
        "Cc": "Konstantin Ananyev <konstantin.ananyev@huawei.com>",
        "Subject": "[PATCH 2/2] examples/l3fwd: avoid packets reorder in ACL mode",
        "Date": "Thu,  2 May 2024 16:28:16 +0100",
        "Message-Id": "<20240502152816.65562-3-konstantin.v.ananyev@yandex.ru>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20240502152816.65562-1-konstantin.v.ananyev@yandex.ru>",
        "References": "<20240502152816.65562-1-konstantin.v.ananyev@yandex.ru>",
        "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": "From: Konstantin Ananyev <konstantin.ananyev@huawei.com>\n\nIn ACL mode l3fwd first do classify() and send() for ipv4 packets,\nthen the same procedure for ipv6.\nThat might cause packets reordering within one ingress queue.\nProbably not a big deal, as order within each flow are still preserved,\nbut better to be avoided anyway.\nSpecially considering that in other modes (lpm, fib, em) l3fwd does preserve\nthe order no matter of packet's IP version.\nThis patch aims to make ACL mode to behave in the same manner and preserve\npacket's order within the same ingress queue.\nAlso these changes allow ACL mode to use common (and hopefully better optimized)\nsend_packets_multi() function at TX path.\n\nSigned-off-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>\n---\n examples/l3fwd/l3fwd_acl.c        | 125 +++++++++++++++++++-----------\n examples/l3fwd/l3fwd_acl_scalar.h |  71 +++++++++--------\n 2 files changed, 118 insertions(+), 78 deletions(-)",
    "diff": "diff --git a/examples/l3fwd/l3fwd_acl.c b/examples/l3fwd/l3fwd_acl.c\nindex d9e4ae543f..ab8222c9db 100644\n--- a/examples/l3fwd/l3fwd_acl.c\n+++ b/examples/l3fwd/l3fwd_acl.c\n@@ -235,18 +235,6 @@ enum {\n RTE_ACL_RULE_DEF(acl4_rule, RTE_DIM(ipv4_defs));\n RTE_ACL_RULE_DEF(acl6_rule, RTE_DIM(ipv6_defs));\n \n-struct acl_search_t {\n-\tconst uint8_t *data_ipv4[MAX_PKT_BURST];\n-\tstruct rte_mbuf *m_ipv4[MAX_PKT_BURST];\n-\tuint32_t res_ipv4[MAX_PKT_BURST];\n-\tint num_ipv4;\n-\n-\tconst uint8_t *data_ipv6[MAX_PKT_BURST];\n-\tstruct rte_mbuf *m_ipv6[MAX_PKT_BURST];\n-\tuint32_t res_ipv6[MAX_PKT_BURST];\n-\tint num_ipv6;\n-};\n-\n static struct {\n \tstruct rte_acl_ctx *acx_ipv4[NB_SOCKETS];\n \tstruct rte_acl_ctx *acx_ipv6[NB_SOCKETS];\n@@ -988,11 +976,86 @@ setup_acl(const int socket_id)\n \n }\n \n+static inline void\n+dump_denied_pkt(const struct rte_mbuf *pkt, uint32_t res)\n+{\n+#ifdef L3FWDACL_DEBUG\n+\tif ((res & ACL_DENY_SIGNATURE) != 0) {\n+\t\tif (RTE_ETH_IS_IPV4_HDR(pkt->packet_type))\n+\t\t\tdump_acl4_rule(pkt, res);\n+\t\telse if (RTE_ETH_IS_IPV6_HDR(pkt[i]->packet_type))\n+\t\t\tdump_acl6_rule(pkt[i], res[i]);\n+\t}\n+#else\n+\tRTE_SET_USED(pkt);\n+\tRTE_SET_USED(res);\n+#endif\n+}\n+\n+static inline void\n+acl_process_pkts(struct rte_mbuf *pkts[MAX_PKT_BURST],\n+\tuint16_t hops[MAX_PKT_BURST], uint32_t num, int32_t socketid)\n+{\n+\tuint32_t i, n4, n6, res;\n+\tstruct acl_search_t acl_search;\n+\n+\t/* split packets burst depending on packet type (IPv4/IPv6) */\n+\tl3fwd_acl_prepare_acl_parameter(pkts, &acl_search, num);\n+\n+\tif (acl_search.num_ipv4)\n+\t\trte_acl_classify(acl_config.acx_ipv4[socketid],\n+\t\t\t\tacl_search.data_ipv4,\n+\t\t\t\tacl_search.res_ipv4,\n+\t\t\t\tacl_search.num_ipv4,\n+\t\t\t\tDEFAULT_MAX_CATEGORIES);\n+\n+\tif (acl_search.num_ipv6)\n+\t\trte_acl_classify(acl_config.acx_ipv6[socketid],\n+\t\t\t\tacl_search.data_ipv6,\n+\t\t\t\tacl_search.res_ipv6,\n+\t\t\t\tacl_search.num_ipv6,\n+\t\t\t\tDEFAULT_MAX_CATEGORIES);\n+\n+\t/* combine lookup results back, into one array of next hops */\n+\tn4 = 0;\n+\tn6 = 0;\n+\tfor (i = 0; i != num; i++) {\n+\t\tswitch (acl_search.types[i]) {\n+\t\tcase TYPE_IPV4:\n+\t\t\tres = acl_search.res_ipv4[n4++];\n+\t\t\tbreak;\n+\t\tcase TYPE_IPV6:\n+\t\t\tres = acl_search.res_ipv6[n6++];\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tres = 0;\n+\t\t}\n+\t\tif (likely((res & ACL_DENY_SIGNATURE) == 0 && res != 0))\n+\t\t\thops[i] = res - FWD_PORT_SHIFT;\n+\t\telse {\n+\t\t\thops[i] = BAD_PORT;\n+\t\t\tdump_denied_pkt(pkts[i], res);\n+\t\t}\n+\t}\n+}\n+\n+static inline void\n+acl_send_packets(struct lcore_conf *qconf, struct rte_mbuf *pkts[],\n+\tuint16_t hops[], uint32_t num)\n+{\n+#if defined ACL_SEND_MULTI\n+\tsend_packets_multi(qconf, pkts, hops, num);\n+#else\n+\tsend_packets_single(qconf, pkts, hops, num);\n+#endif\n+}\n+\n /* main processing loop */\n int\n acl_main_loop(__rte_unused void *dummy)\n {\n \tstruct rte_mbuf *pkts_burst[MAX_PKT_BURST];\n+\tuint16_t hops[MAX_PKT_BURST];\n \tunsigned int lcore_id;\n \tuint64_t prev_tsc, diff_tsc, cur_tsc;\n \tint i, nb_rx;\n@@ -1048,7 +1111,7 @@ acl_main_loop(__rte_unused void *dummy)\n \t\t}\n \n \t\t/*\n-\t\t * Read packet from RX queues\n+\t\t * Read packet from RX queues and process them\n \t\t */\n \t\tfor (i = 0; i < qconf->n_rx_queue; ++i) {\n \n@@ -1058,40 +1121,10 @@ acl_main_loop(__rte_unused void *dummy)\n \t\t\t\tpkts_burst, MAX_PKT_BURST);\n \n \t\t\tif (nb_rx > 0) {\n-\t\t\t\tstruct acl_search_t acl_search;\n-\n-\t\t\t\tl3fwd_acl_prepare_acl_parameter(pkts_burst, &acl_search,\n+\t\t\t\tacl_process_pkts(pkts_burst, hops, nb_rx,\n+\t\t\t\t\tsocketid);\n+\t\t\t\tacl_send_packets(qconf, pkts_burst, hops,\n \t\t\t\t\tnb_rx);\n-\n-\t\t\t\tif (acl_search.num_ipv4) {\n-\t\t\t\t\trte_acl_classify(\n-\t\t\t\t\t\tacl_config.acx_ipv4[socketid],\n-\t\t\t\t\t\tacl_search.data_ipv4,\n-\t\t\t\t\t\tacl_search.res_ipv4,\n-\t\t\t\t\t\tacl_search.num_ipv4,\n-\t\t\t\t\t\tDEFAULT_MAX_CATEGORIES);\n-\n-\t\t\t\t\tl3fwd_acl_send_packets(\n-\t\t\t\t\t\tqconf,\n-\t\t\t\t\t\tacl_search.m_ipv4,\n-\t\t\t\t\t\tacl_search.res_ipv4,\n-\t\t\t\t\t\tacl_search.num_ipv4);\n-\t\t\t\t}\n-\n-\t\t\t\tif (acl_search.num_ipv6) {\n-\t\t\t\t\trte_acl_classify(\n-\t\t\t\t\t\tacl_config.acx_ipv6[socketid],\n-\t\t\t\t\t\tacl_search.data_ipv6,\n-\t\t\t\t\t\tacl_search.res_ipv6,\n-\t\t\t\t\t\tacl_search.num_ipv6,\n-\t\t\t\t\t\tDEFAULT_MAX_CATEGORIES);\n-\n-\t\t\t\t\tl3fwd_acl_send_packets(\n-\t\t\t\t\t\tqconf,\n-\t\t\t\t\t\tacl_search.m_ipv6,\n-\t\t\t\t\t\tacl_search.res_ipv6,\n-\t\t\t\t\t\tacl_search.num_ipv6);\n-\t\t\t\t}\n \t\t\t}\n \t\t}\n \t}\ndiff --git a/examples/l3fwd/l3fwd_acl_scalar.h b/examples/l3fwd/l3fwd_acl_scalar.h\nindex 542c303d3b..cb22bb49aa 100644\n--- a/examples/l3fwd/l3fwd_acl_scalar.h\n+++ b/examples/l3fwd/l3fwd_acl_scalar.h\n@@ -6,7 +6,40 @@\n #define L3FWD_ACL_SCALAR_H\n \n #include \"l3fwd.h\"\n+#if defined RTE_ARCH_X86\n+#include \"l3fwd_sse.h\"\n+#elif defined __ARM_NEON\n+#include \"l3fwd_neon.h\"\n+#elif defined RTE_ARCH_PPC_64\n+#include \"l3fwd_altivec.h\"\n+#else\n #include \"l3fwd_common.h\"\n+#endif\n+/*\n+ * If the machine has SSE, NEON or PPC 64 then multiple packets\n+ * can be sent at once if not only single packets will be sent.\n+ */\n+#if defined RTE_ARCH_X86 || defined __ARM_NEON || defined RTE_ARCH_PPC_64\n+#define ACL_SEND_MULTI\n+#endif\n+\n+#define TYPE_NONE\t0\n+#define TYPE_IPV4\t1\n+#define TYPE_IPV6\t2\n+\n+struct acl_search_t {\n+\n+\tuint32_t num_ipv4;\n+\tuint32_t num_ipv6;\n+\n+\tuint8_t types[MAX_PKT_BURST];\n+\n+\tconst uint8_t *data_ipv4[MAX_PKT_BURST];\n+\tuint32_t res_ipv4[MAX_PKT_BURST];\n+\n+\tconst uint8_t *data_ipv6[MAX_PKT_BURST];\n+\tuint32_t res_ipv6[MAX_PKT_BURST];\n+};\n \n static inline void\n l3fwd_acl_prepare_one_packet(struct rte_mbuf **pkts_in, struct acl_search_t *acl,\n@@ -16,16 +49,16 @@ l3fwd_acl_prepare_one_packet(struct rte_mbuf **pkts_in, struct acl_search_t *acl\n \n \tif (RTE_ETH_IS_IPV4_HDR(pkt->packet_type)) {\n \t\t/* Fill acl structure */\n-\t\tacl->data_ipv4[acl->num_ipv4] = MBUF_IPV4_2PROTO(pkt);\n-\t\tacl->m_ipv4[(acl->num_ipv4)++] = pkt;\n+\t\tacl->data_ipv4[acl->num_ipv4++] = MBUF_IPV4_2PROTO(pkt);\n+\t\tacl->types[index] = TYPE_IPV4;\n \n \t} else if (RTE_ETH_IS_IPV6_HDR(pkt->packet_type)) {\n \t\t/* Fill acl structure */\n-\t\tacl->data_ipv6[acl->num_ipv6] = MBUF_IPV6_2PROTO(pkt);\n-\t\tacl->m_ipv6[(acl->num_ipv6)++] = pkt;\n+\t\tacl->data_ipv6[acl->num_ipv6++] = MBUF_IPV6_2PROTO(pkt);\n+\t\tacl->types[index] = TYPE_IPV6;\n \t} else {\n-\t\t/* Unknown type, drop the packet */\n-\t\trte_pktmbuf_free(pkt);\n+\t\t/* Unknown type, will drop the packet */\n+\t\tacl->types[index] = TYPE_NONE;\n \t}\n }\n \n@@ -80,30 +113,4 @@ send_packets_single(struct lcore_conf *qconf, struct rte_mbuf *pkts[], uint16_t\n \t}\n }\n \n-static inline void\n-l3fwd_acl_send_packets(struct lcore_conf *qconf, struct rte_mbuf *pkts[], uint32_t res[],\n-\tuint32_t nb_tx)\n-{\n-\tuint32_t i;\n-\tuint16_t dst_port[nb_tx];\n-\n-\tfor (i = 0; i != nb_tx; i++) {\n-\t\tif (likely((res[i] & ACL_DENY_SIGNATURE) == 0 && res[i] != 0)) {\n-\t\t\tdst_port[i] = res[i] - FWD_PORT_SHIFT;\n-\t\t} else {\n-\t\t\tdst_port[i] = BAD_PORT;\n-#ifdef L3FWDACL_DEBUG\n-\t\t\tif ((res & ACL_DENY_SIGNATURE) != 0) {\n-\t\t\t\tif (RTE_ETH_IS_IPV4_HDR(pkts[i]->packet_type))\n-\t\t\t\t\tdump_acl4_rule(pkts[i], res[i]);\n-\t\t\t\telse if (RTE_ETH_IS_IPV6_HDR(pkt[i]->packet_type))\n-\t\t\t\t\tdump_acl6_rule(pkt[i], res[i]);\n-\t\t\t}\n-#endif\n-\t\t}\n-\t}\n-\n-\tsend_packets_single(qconf, pkts, dst_port, nb_tx);\n-}\n-\n #endif /* L3FWD_ACL_SCALAR_H */\n",
    "prefixes": [
        "2/2"
    ]
}