get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 82617,
    "url": "https://patches.dpdk.org/api/patches/82617/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20201028102640.3191964-5-thomas@monjalon.net/",
    "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": "<20201028102640.3191964-5-thomas@monjalon.net>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20201028102640.3191964-5-thomas@monjalon.net",
    "date": "2020-10-28T10:26:29",
    "name": "[v4,04/15] node: switch IPv4 metadata to dynamic mbuf field",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "24ff2364c56d27f176690d9f6f0db6541a68849f",
    "submitter": {
        "id": 685,
        "url": "https://patches.dpdk.org/api/people/685/?format=api",
        "name": "Thomas Monjalon",
        "email": "thomas@monjalon.net"
    },
    "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/20201028102640.3191964-5-thomas@monjalon.net/mbox/",
    "series": [
        {
            "id": 13416,
            "url": "https://patches.dpdk.org/api/series/13416/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=13416",
            "date": "2020-10-28T10:26:25",
            "name": "remove mbuf userdata",
            "version": 4,
            "mbox": "https://patches.dpdk.org/series/13416/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/82617/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/82617/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 3A127A04DD;\n\tWed, 28 Oct 2020 11:28:24 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 06F31C9E0;\n\tWed, 28 Oct 2020 11:27:14 +0100 (CET)",
            "from new1-smtp.messagingengine.com (new1-smtp.messagingengine.com\n [66.111.4.221]) by dpdk.org (Postfix) with ESMTP id 7CC36C9D4\n for <dev@dpdk.org>; Wed, 28 Oct 2020 11:27:10 +0100 (CET)",
            "from compute2.internal (compute2.nyi.internal [10.202.2.42])\n by mailnew.nyi.internal (Postfix) with ESMTP id 2E40B580388;\n Wed, 28 Oct 2020 06:27:09 -0400 (EDT)",
            "from mailfrontend1 ([10.202.2.162])\n by compute2.internal (MEProxy); Wed, 28 Oct 2020 06:27:09 -0400",
            "from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184])\n by mail.messagingengine.com (Postfix) with ESMTPA id 603C23280059;\n Wed, 28 Oct 2020 06:27:07 -0400 (EDT)"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h=\n from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding; s=fm2; bh=b2/UgouepwNuH\n akdJkmPqZDAY7jia25Ie/3cISWNZ/4=; b=NEmu+9W4Hi8cidOKzp4DwszBQC/qV\n DOvx4IuXfJN2dIoTS50kxVWUYXsPWPLVB+rogpdgX5cXly41QmGAu8G7rS2gHTur\n pYiuvSZcnZHvcQEKfQifF2riCOTB5VmuQ+lQ3ukyFFcUGedY/Alq3YH7g7p0Dvxy\n dJmai5KQmWpyG8KaLkvO8FNNh6T5J9WGzzvGOxMvDlgpNFbzXKtf3luxJFTLsLDs\n mTFBcgYw1LYBGG2MWKAQGyOe6IJ73b0v9P+bdXUBRfPfPWE7unUXOKCOhy4qq+1B\n qXw3n26gQQ8MViCCWk0BLk3/OHQdxPfEaaRtYrwC0RhMfcNYtslLH9QRw==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=\n messagingengine.com; h=cc:content-transfer-encoding:date:from\n :in-reply-to:message-id:mime-version:references:subject:to\n :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=\n fm1; bh=b2/UgouepwNuHakdJkmPqZDAY7jia25Ie/3cISWNZ/4=; b=GL6FkAJ6\n 5BOiH4eLh20yx3gexG5grYvgXrGtPHFyJvO4X05o7y9I9qqcYrr3ZBSwwIe63Ekq\n CWK82rtQUR/hq+35JKZNgxBS47Hd7xHec4oCDTpqD0RWzHX9kmyWGERk1ah6mqoP\n agwlE5sJlbJezX4gYOnxOFg51CgjU672/lP6NdQhX5Qk4vh4SSoF79K05KBcxufu\n LzgnQKmSYs9NnCdSrSi6oXuci/UjVVP2FP5bFsAx/r6ZMjsPzYax56MbHYoyTtHB\n Bwbvz6VuhAR+OU889rTkga9SmnGVr5nh+Trh/3H8nUX8p7QqHoVhBmtARkelYA3t\n iOZEJdEFNeKlVA=="
        ],
        "X-ME-Sender": "<xms:fEeZX6kkoTQjv2uU83HsN3WkZNBOyiJGW_JMM6RTkKubM39byOkjPA>\n <xme:fEeZXx2OTtGy0gvx8gJXxsnblh0WeaoJloBEeOH3gzILLSPicPqkbcOxSS-4mCwB_\n FoUc9jDOUxowg1QQw>",
        "X-ME-Proxy-Cause": "\n gggruggvucftvghtrhhoucdtuddrgedujedrledugdduhecutefuodetggdotefrodftvf\n curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu\n uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc\n fjughrpefhvffufffkofgjfhgggfestdekredtredttdenucfhrhhomhepvfhhohhmrghs\n ucfoohhnjhgrlhhonhcuoehthhhomhgrshesmhhonhhjrghlohhnrdhnvghtqeenucggtf\n frrghtthgvrhhnpedvhefgiedvjeegtdevheefhfetleefgfeivefgffevfeejgedtgfeu\n tdehtdegveenucfkphepjeejrddufeegrddvtdefrddukeegnecuvehluhhsthgvrhfuih\n iivgepfeenucfrrghrrghmpehmrghilhhfrhhomhepthhhohhmrghssehmohhnjhgrlhho\n nhdrnhgvth",
        "X-ME-Proxy": "<xmx:fEeZX4roPNKj663HlPhHSE1Siq32MZAXlml14hDQyMalHEIuAPbRag>\n <xmx:fEeZX-lq9oz6WMRAkvDT-8L1Jg0eLXm84KZMVQ62MQR9HsW3bqdEaQ>\n <xmx:fEeZX42fCEJsqmAH8z5eE2ZqDKX-Kvr-SjE-fpl0UN5bOjgMKahqaQ>\n <xmx:fUeZX-wXEKbOZyxf0k5E-G71sHHKevkANYaRzRC83tYeFjeSx3hx2g>",
        "From": "Thomas Monjalon <thomas@monjalon.net>",
        "To": "dev@dpdk.org",
        "Cc": "ferruh.yigit@intel.com, david.marchand@redhat.com,\n bruce.richardson@intel.com, olivier.matz@6wind.com,\n andrew.rybchenko@oktetlabs.ru, akhil.goyal@nxp.com,\n Nithin Dabilpuram <ndabilpuram@marvell.com>,\n Pavan Nikhilesh <pbhagavatula@marvell.com>,\n Jerin Jacob <jerinj@marvell.com>, Ruifeng Wang <ruifeng.wang@arm.com>,\n Konstantin Ananyev <konstantin.ananyev@intel.com>",
        "Date": "Wed, 28 Oct 2020 11:26:29 +0100",
        "Message-Id": "<20201028102640.3191964-5-thomas@monjalon.net>",
        "X-Mailer": "git-send-email 2.28.0",
        "In-Reply-To": "<20201028102640.3191964-1-thomas@monjalon.net>",
        "References": "<20201026052105.1561859-1-thomas@monjalon.net>\n <20201028102640.3191964-1-thomas@monjalon.net>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v4 04/15] node: switch IPv4 metadata to dynamic\n\tmbuf field",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "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": "From: Nithin Dabilpuram <ndabilpuram@marvell.com>\n\nThe node_mbuf_priv1 was stored in the deprecated mbuf field udata64.\nIt is moved to a dynamic field in order to allow removal of udata64.\n\nSigned-off-by: Thomas Monjalon <thomas@monjalon.net>\nSigned-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>\n---\n lib/librte_node/ip4_lookup.c      | 40 ++++++++++++++++++-------\n lib/librte_node/ip4_lookup_neon.h | 20 ++++++-------\n lib/librte_node/ip4_lookup_sse.h  | 36 +++++++++++------------\n lib/librte_node/ip4_rewrite.c     | 49 +++++++++++++++++++++++--------\n lib/librte_node/node_private.h    | 13 ++++++--\n 5 files changed, 103 insertions(+), 55 deletions(-)",
    "diff": "diff --git a/lib/librte_node/ip4_lookup.c b/lib/librte_node/ip4_lookup.c\nindex 8835aab9dd..d083a725fc 100644\n--- a/lib/librte_node/ip4_lookup.c\n+++ b/lib/librte_node/ip4_lookup.c\n@@ -29,8 +29,23 @@ struct ip4_lookup_node_main {\n \tstruct rte_lpm *lpm_tbl[RTE_MAX_NUMA_NODES];\n };\n \n+struct ip4_lookup_node_ctx {\n+\t/* Socket's LPM table */\n+\tstruct rte_lpm *lpm;\n+\t/* Dynamic offset to mbuf priv1 */\n+\tint mbuf_priv1_off;\n+};\n+\n+int node_mbuf_priv1_dynfield_offset = -1;\n+\n static struct ip4_lookup_node_main ip4_lookup_nm;\n \n+#define IP4_LOOKUP_NODE_LPM(ctx) \\\n+\t(((struct ip4_lookup_node_ctx *)ctx)->lpm)\n+\n+#define IP4_LOOKUP_NODE_PRIV1_OFF(ctx) \\\n+\t(((struct ip4_lookup_node_ctx *)ctx)->mbuf_priv1_off)\n+\n #if defined(__ARM_NEON)\n #include \"ip4_lookup_neon.h\"\n #elif defined(RTE_ARCH_X86)\n@@ -41,12 +56,13 @@ static uint16_t\n ip4_lookup_node_process_scalar(struct rte_graph *graph, struct rte_node *node,\n \t\t\tvoid **objs, uint16_t nb_objs)\n {\n+\tstruct rte_lpm *lpm = IP4_LOOKUP_NODE_LPM(node->ctx);\n+\tconst int dyn = IP4_LOOKUP_NODE_PRIV1_OFF(node->ctx);\n \tstruct rte_ipv4_hdr *ipv4_hdr;\n \tvoid **to_next, **from;\n \tuint16_t last_spec = 0;\n \tstruct rte_mbuf *mbuf;\n \trte_edge_t next_index;\n-\tstruct rte_lpm *lpm;\n \tuint16_t held = 0;\n \tuint32_t drop_nh;\n \tint i, rc;\n@@ -55,9 +71,6 @@ ip4_lookup_node_process_scalar(struct rte_graph *graph, struct rte_node *node,\n \tnext_index = RTE_NODE_IP4_LOOKUP_NEXT_REWRITE;\n \t/* Drop node */\n \tdrop_nh = ((uint32_t)RTE_NODE_IP4_LOOKUP_NEXT_PKT_DROP) << 16;\n-\n-\t/* Get socket specific LPM from ctx */\n-\tlpm = *((struct rte_lpm **)node->ctx);\n \tfrom = objs;\n \n \t/* Get stream for the speculated next node */\n@@ -72,14 +85,14 @@ ip4_lookup_node_process_scalar(struct rte_graph *graph, struct rte_node *node,\n \t\tipv4_hdr = rte_pktmbuf_mtod_offset(mbuf, struct rte_ipv4_hdr *,\n \t\t\t\tsizeof(struct rte_ether_hdr));\n \t\t/* Extract cksum, ttl as ipv4 hdr is in cache */\n-\t\tnode_mbuf_priv1(mbuf)->cksum = ipv4_hdr->hdr_checksum;\n-\t\tnode_mbuf_priv1(mbuf)->ttl = ipv4_hdr->time_to_live;\n+\t\tnode_mbuf_priv1(mbuf, dyn)->cksum = ipv4_hdr->hdr_checksum;\n+\t\tnode_mbuf_priv1(mbuf, dyn)->ttl = ipv4_hdr->time_to_live;\n \n \t\trc = rte_lpm_lookup(lpm, rte_be_to_cpu_32(ipv4_hdr->dst_addr),\n \t\t\t\t    &next_hop);\n \t\tnext_hop = (rc == 0) ? next_hop : drop_nh;\n \n-\t\tnode_mbuf_priv1(mbuf)->nh = (uint16_t)next_hop;\n+\t\tnode_mbuf_priv1(mbuf, dyn)->nh = (uint16_t)next_hop;\n \t\tnext_hop = next_hop >> 16;\n \t\tnext = (uint16_t)next_hop;\n \n@@ -169,15 +182,19 @@ setup_lpm(struct ip4_lookup_node_main *nm, int socket)\n static int\n ip4_lookup_node_init(const struct rte_graph *graph, struct rte_node *node)\n {\n-\tstruct rte_lpm **lpm_p = (struct rte_lpm **)&node->ctx;\n \tuint16_t socket, lcore_id;\n \tstatic uint8_t init_once;\n \tint rc;\n \n \tRTE_SET_USED(graph);\n-\tRTE_SET_USED(node);\n+\tRTE_BUILD_BUG_ON(sizeof(struct ip4_lookup_node_ctx) > RTE_NODE_CTX_SZ);\n \n \tif (!init_once) {\n+\t\tnode_mbuf_priv1_dynfield_offset = rte_mbuf_dynfield_register(\n+\t\t\t\t&node_mbuf_priv1_dynfield_desc);\n+\t\tif (node_mbuf_priv1_dynfield_offset < 0)\n+\t\t\treturn -rte_errno;\n+\n \t\t/* Setup LPM tables for all sockets */\n \t\tRTE_LCORE_FOREACH(lcore_id)\n \t\t{\n@@ -192,7 +209,10 @@ ip4_lookup_node_init(const struct rte_graph *graph, struct rte_node *node)\n \t\t}\n \t\tinit_once = 1;\n \t}\n-\t*lpm_p = ip4_lookup_nm.lpm_tbl[graph->socket];\n+\n+\t/* Update socket's LPM and mbuf dyn priv1 offset in node ctx */\n+\tIP4_LOOKUP_NODE_LPM(node->ctx) = ip4_lookup_nm.lpm_tbl[graph->socket];\n+\tIP4_LOOKUP_NODE_PRIV1_OFF(node->ctx) = node_mbuf_priv1_dynfield_offset;\n \n #if defined(__ARM_NEON) || defined(RTE_ARCH_X86)\n \tif (rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_128)\ndiff --git a/lib/librte_node/ip4_lookup_neon.h b/lib/librte_node/ip4_lookup_neon.h\nindex 0ad2763b82..d5c8da3719 100644\n--- a/lib/librte_node/ip4_lookup_neon.h\n+++ b/lib/librte_node/ip4_lookup_neon.h\n@@ -11,12 +11,13 @@ ip4_lookup_node_process_vec(struct rte_graph *graph, struct rte_node *node,\n \t\t\tvoid **objs, uint16_t nb_objs)\n {\n \tstruct rte_mbuf *mbuf0, *mbuf1, *mbuf2, *mbuf3, **pkts;\n+\tstruct rte_lpm *lpm = IP4_LOOKUP_NODE_LPM(node->ctx);\n+\tconst int dyn = IP4_LOOKUP_NODE_PRIV1_OFF(node->ctx);\n \tstruct rte_ipv4_hdr *ipv4_hdr;\n \tvoid **to_next, **from;\n \tuint16_t last_spec = 0;\n \trte_edge_t next_index;\n \tuint16_t n_left_from;\n-\tstruct rte_lpm *lpm;\n \tuint16_t held = 0;\n \tuint32_t drop_nh;\n \trte_xmm_t result;\n@@ -30,9 +31,6 @@ ip4_lookup_node_process_vec(struct rte_graph *graph, struct rte_node *node,\n \t/* Drop node */\n \tdrop_nh = ((uint32_t)RTE_NODE_IP4_LOOKUP_NEXT_PKT_DROP) << 16;\n \n-\t/* Get socket specific LPM from ctx */\n-\tlpm = *((struct rte_lpm **)node->ctx);\n-\n \tpkts = (struct rte_mbuf **)objs;\n \tfrom = objs;\n \tn_left_from = nb_objs;\n@@ -119,10 +117,10 @@ ip4_lookup_node_process_vec(struct rte_graph *graph, struct rte_node *node,\n \t\tpriv23.u16[0] = result.u16[4];\n \t\tpriv23.u16[4] = result.u16[6];\n \n-\t\tnode_mbuf_priv1(mbuf0)->u = priv01.u64[0];\n-\t\tnode_mbuf_priv1(mbuf1)->u = priv01.u64[1];\n-\t\tnode_mbuf_priv1(mbuf2)->u = priv23.u64[0];\n-\t\tnode_mbuf_priv1(mbuf3)->u = priv23.u64[1];\n+\t\tnode_mbuf_priv1(mbuf0, dyn)->u = priv01.u64[0];\n+\t\tnode_mbuf_priv1(mbuf1, dyn)->u = priv01.u64[1];\n+\t\tnode_mbuf_priv1(mbuf2, dyn)->u = priv23.u64[0];\n+\t\tnode_mbuf_priv1(mbuf3, dyn)->u = priv23.u64[1];\n \n \t\t/* Enqueue four to next node */\n \t\trte_edge_t fix_spec = ((next_index == result.u16[1]) &&\n@@ -197,14 +195,14 @@ ip4_lookup_node_process_vec(struct rte_graph *graph, struct rte_node *node,\n \t\tipv4_hdr = rte_pktmbuf_mtod_offset(mbuf0, struct rte_ipv4_hdr *,\n \t\t\t\t\t\tsizeof(struct rte_ether_hdr));\n \t\t/* Extract cksum, ttl as ipv4 hdr is in cache */\n-\t\tnode_mbuf_priv1(mbuf0)->cksum = ipv4_hdr->hdr_checksum;\n-\t\tnode_mbuf_priv1(mbuf0)->ttl = ipv4_hdr->time_to_live;\n+\t\tnode_mbuf_priv1(mbuf0, dyn)->cksum = ipv4_hdr->hdr_checksum;\n+\t\tnode_mbuf_priv1(mbuf0, dyn)->ttl = ipv4_hdr->time_to_live;\n \n \t\trc = rte_lpm_lookup(lpm, rte_be_to_cpu_32(ipv4_hdr->dst_addr),\n \t\t\t\t    &next_hop);\n \t\tnext_hop = (rc == 0) ? next_hop : drop_nh;\n \n-\t\tnode_mbuf_priv1(mbuf0)->nh = (uint16_t)next_hop;\n+\t\tnode_mbuf_priv1(mbuf0, dyn)->nh = (uint16_t)next_hop;\n \t\tnext_hop = next_hop >> 16;\n \t\tnext0 = (uint16_t)next_hop;\n \ndiff --git a/lib/librte_node/ip4_lookup_sse.h b/lib/librte_node/ip4_lookup_sse.h\nindex 264c986071..74dbf97533 100644\n--- a/lib/librte_node/ip4_lookup_sse.h\n+++ b/lib/librte_node/ip4_lookup_sse.h\n@@ -11,13 +11,14 @@ ip4_lookup_node_process_vec(struct rte_graph *graph, struct rte_node *node,\n \t\t\tvoid **objs, uint16_t nb_objs)\n {\n \tstruct rte_mbuf *mbuf0, *mbuf1, *mbuf2, *mbuf3, **pkts;\n+\tstruct rte_lpm *lpm = IP4_LOOKUP_NODE_LPM(node->ctx);\n+\tconst int dyn = IP4_LOOKUP_NODE_PRIV1_OFF(node->ctx);\n \trte_edge_t next0, next1, next2, next3, next_index;\n \tstruct rte_ipv4_hdr *ipv4_hdr;\n \tuint32_t ip0, ip1, ip2, ip3;\n \tvoid **to_next, **from;\n \tuint16_t last_spec = 0;\n \tuint16_t n_left_from;\n-\tstruct rte_lpm *lpm;\n \tuint16_t held = 0;\n \tuint32_t drop_nh;\n \trte_xmm_t dst;\n@@ -29,9 +30,6 @@ ip4_lookup_node_process_vec(struct rte_graph *graph, struct rte_node *node,\n \t/* Drop node */\n \tdrop_nh = ((uint32_t)RTE_NODE_IP4_LOOKUP_NEXT_PKT_DROP) << 16;\n \n-\t/* Get socket specific LPM from ctx */\n-\tlpm = *((struct rte_lpm **)node->ctx);\n-\n \tpkts = (struct rte_mbuf **)objs;\n \tfrom = objs;\n \tn_left_from = nb_objs;\n@@ -78,24 +76,24 @@ ip4_lookup_node_process_vec(struct rte_graph *graph, struct rte_node *node,\n \t\t\t\t\t\tsizeof(struct rte_ether_hdr));\n \t\tip0 = ipv4_hdr->dst_addr;\n \t\t/* Extract cksum, ttl as ipv4 hdr is in cache */\n-\t\tnode_mbuf_priv1(mbuf0)->cksum = ipv4_hdr->hdr_checksum;\n-\t\tnode_mbuf_priv1(mbuf0)->ttl = ipv4_hdr->time_to_live;\n+\t\tnode_mbuf_priv1(mbuf0, dyn)->cksum = ipv4_hdr->hdr_checksum;\n+\t\tnode_mbuf_priv1(mbuf0, dyn)->ttl = ipv4_hdr->time_to_live;\n \n \t\t/* Extract DIP of mbuf1 */\n \t\tipv4_hdr = rte_pktmbuf_mtod_offset(mbuf1, struct rte_ipv4_hdr *,\n \t\t\t\t\t\tsizeof(struct rte_ether_hdr));\n \t\tip1 = ipv4_hdr->dst_addr;\n \t\t/* Extract cksum, ttl as ipv4 hdr is in cache */\n-\t\tnode_mbuf_priv1(mbuf1)->cksum = ipv4_hdr->hdr_checksum;\n-\t\tnode_mbuf_priv1(mbuf1)->ttl = ipv4_hdr->time_to_live;\n+\t\tnode_mbuf_priv1(mbuf1, dyn)->cksum = ipv4_hdr->hdr_checksum;\n+\t\tnode_mbuf_priv1(mbuf1, dyn)->ttl = ipv4_hdr->time_to_live;\n \n \t\t/* Extract DIP of mbuf2 */\n \t\tipv4_hdr = rte_pktmbuf_mtod_offset(mbuf2, struct rte_ipv4_hdr *,\n \t\t\t\t\t\tsizeof(struct rte_ether_hdr));\n \t\tip2 = ipv4_hdr->dst_addr;\n \t\t/* Extract cksum, ttl as ipv4 hdr is in cache */\n-\t\tnode_mbuf_priv1(mbuf2)->cksum = ipv4_hdr->hdr_checksum;\n-\t\tnode_mbuf_priv1(mbuf2)->ttl = ipv4_hdr->time_to_live;\n+\t\tnode_mbuf_priv1(mbuf2, dyn)->cksum = ipv4_hdr->hdr_checksum;\n+\t\tnode_mbuf_priv1(mbuf2, dyn)->ttl = ipv4_hdr->time_to_live;\n \n \t\t/* Extract DIP of mbuf3 */\n \t\tipv4_hdr = rte_pktmbuf_mtod_offset(mbuf3, struct rte_ipv4_hdr *,\n@@ -111,23 +109,23 @@ ip4_lookup_node_process_vec(struct rte_graph *graph, struct rte_node *node,\n \t\tdip = _mm_shuffle_epi8(dip, bswap_mask);\n \n \t\t/* Extract cksum, ttl as ipv4 hdr is in cache */\n-\t\tnode_mbuf_priv1(mbuf3)->cksum = ipv4_hdr->hdr_checksum;\n-\t\tnode_mbuf_priv1(mbuf3)->ttl = ipv4_hdr->time_to_live;\n+\t\tnode_mbuf_priv1(mbuf3, dyn)->cksum = ipv4_hdr->hdr_checksum;\n+\t\tnode_mbuf_priv1(mbuf3, dyn)->ttl = ipv4_hdr->time_to_live;\n \n \t\t/* Perform LPM lookup to get NH and next node */\n \t\trte_lpm_lookupx4(lpm, dip, dst.u32, drop_nh);\n \n \t\t/* Extract next node id and NH */\n-\t\tnode_mbuf_priv1(mbuf0)->nh = dst.u32[0] & 0xFFFF;\n+\t\tnode_mbuf_priv1(mbuf0, dyn)->nh = dst.u32[0] & 0xFFFF;\n \t\tnext0 = (dst.u32[0] >> 16);\n \n-\t\tnode_mbuf_priv1(mbuf1)->nh = dst.u32[1] & 0xFFFF;\n+\t\tnode_mbuf_priv1(mbuf1, dyn)->nh = dst.u32[1] & 0xFFFF;\n \t\tnext1 = (dst.u32[1] >> 16);\n \n-\t\tnode_mbuf_priv1(mbuf2)->nh = dst.u32[2] & 0xFFFF;\n+\t\tnode_mbuf_priv1(mbuf2, dyn)->nh = dst.u32[2] & 0xFFFF;\n \t\tnext2 = (dst.u32[2] >> 16);\n \n-\t\tnode_mbuf_priv1(mbuf3)->nh = dst.u32[3] & 0xFFFF;\n+\t\tnode_mbuf_priv1(mbuf3, dyn)->nh = dst.u32[3] & 0xFFFF;\n \t\tnext3 = (dst.u32[3] >> 16);\n \n \t\t/* Enqueue four to next node */\n@@ -202,14 +200,14 @@ ip4_lookup_node_process_vec(struct rte_graph *graph, struct rte_node *node,\n \t\tipv4_hdr = rte_pktmbuf_mtod_offset(mbuf0, struct rte_ipv4_hdr *,\n \t\t\t\t\t\tsizeof(struct rte_ether_hdr));\n \t\t/* Extract cksum, ttl as ipv4 hdr is in cache */\n-\t\tnode_mbuf_priv1(mbuf0)->cksum = ipv4_hdr->hdr_checksum;\n-\t\tnode_mbuf_priv1(mbuf0)->ttl = ipv4_hdr->time_to_live;\n+\t\tnode_mbuf_priv1(mbuf0, dyn)->cksum = ipv4_hdr->hdr_checksum;\n+\t\tnode_mbuf_priv1(mbuf0, dyn)->ttl = ipv4_hdr->time_to_live;\n \n \t\trc = rte_lpm_lookup(lpm, rte_be_to_cpu_32(ipv4_hdr->dst_addr),\n \t\t\t\t    &next_hop);\n \t\tnext_hop = (rc == 0) ? next_hop : drop_nh;\n \n-\t\tnode_mbuf_priv1(mbuf0)->nh = next_hop & 0xFFFF;\n+\t\tnode_mbuf_priv1(mbuf0, dyn)->nh = next_hop & 0xFFFF;\n \t\tnext0 = (next_hop >> 16);\n \n \t\tif (unlikely(next_index ^ next0)) {\ndiff --git a/lib/librte_node/ip4_rewrite.c b/lib/librte_node/ip4_rewrite.c\nindex bb7f671b5c..99ecb457ff 100644\n--- a/lib/librte_node/ip4_rewrite.c\n+++ b/lib/librte_node/ip4_rewrite.c\n@@ -19,14 +19,28 @@\n #include \"ip4_rewrite_priv.h\"\n #include \"node_private.h\"\n \n+struct ip4_rewrite_node_ctx {\n+\t/* Dynamic offset to mbuf priv1 */\n+\tint mbuf_priv1_off;\n+\t/* Cached next index */\n+\tuint16_t next_index;\n+};\n+\n static struct ip4_rewrite_node_main *ip4_rewrite_nm;\n \n+#define IP4_REWRITE_NODE_LAST_NEXT(ctx) \\\n+\t(((struct ip4_rewrite_node_ctx *)ctx)->next_index)\n+\n+#define IP4_REWRITE_NODE_PRIV1_OFF(ctx) \\\n+\t(((struct ip4_rewrite_node_ctx *)ctx)->mbuf_priv1_off)\n+\n static uint16_t\n ip4_rewrite_node_process(struct rte_graph *graph, struct rte_node *node,\n \t\t\t void **objs, uint16_t nb_objs)\n {\n \tstruct rte_mbuf *mbuf0, *mbuf1, *mbuf2, *mbuf3, **pkts;\n \tstruct ip4_rewrite_nh_header *nh = ip4_rewrite_nm->nh;\n+\tconst int dyn = IP4_REWRITE_NODE_PRIV1_OFF(node->ctx);\n \tuint16_t next0, next1, next2, next3, next_index;\n \tstruct rte_ipv4_hdr *ip0, *ip1, *ip2, *ip3;\n \tuint16_t n_left_from, held = 0, last_spec = 0;\n@@ -37,7 +51,7 @@ ip4_rewrite_node_process(struct rte_graph *graph, struct rte_node *node,\n \tint i;\n \n \t/* Speculative next as last next */\n-\tnext_index = *(uint16_t *)node->ctx;\n+\tnext_index = IP4_REWRITE_NODE_LAST_NEXT(node->ctx);\n \trte_prefetch0(nh);\n \n \tpkts = (struct rte_mbuf **)objs;\n@@ -68,10 +82,10 @@ ip4_rewrite_node_process(struct rte_graph *graph, struct rte_node *node,\n \n \t\tpkts += 4;\n \t\tn_left_from -= 4;\n-\t\tpriv01.u64[0] = node_mbuf_priv1(mbuf0)->u;\n-\t\tpriv01.u64[1] = node_mbuf_priv1(mbuf1)->u;\n-\t\tpriv23.u64[0] = node_mbuf_priv1(mbuf2)->u;\n-\t\tpriv23.u64[1] = node_mbuf_priv1(mbuf3)->u;\n+\t\tpriv01.u64[0] = node_mbuf_priv1(mbuf0, dyn)->u;\n+\t\tpriv01.u64[1] = node_mbuf_priv1(mbuf1, dyn)->u;\n+\t\tpriv23.u64[0] = node_mbuf_priv1(mbuf2, dyn)->u;\n+\t\tpriv23.u64[1] = node_mbuf_priv1(mbuf3, dyn)->u;\n \n \t\t/* Increment checksum by one. */\n \t\tpriv01.u32[1] += rte_cpu_to_be_16(0x0100);\n@@ -203,17 +217,17 @@ ip4_rewrite_node_process(struct rte_graph *graph, struct rte_node *node,\n \t\tn_left_from -= 1;\n \n \t\td0 = rte_pktmbuf_mtod(mbuf0, void *);\n-\t\trte_memcpy(d0, nh[node_mbuf_priv1(mbuf0)->nh].rewrite_data,\n-\t\t\t   nh[node_mbuf_priv1(mbuf0)->nh].rewrite_len);\n+\t\trte_memcpy(d0, nh[node_mbuf_priv1(mbuf0, dyn)->nh].rewrite_data,\n+\t\t\t   nh[node_mbuf_priv1(mbuf0, dyn)->nh].rewrite_len);\n \n-\t\tnext0 = nh[node_mbuf_priv1(mbuf0)->nh].tx_node;\n+\t\tnext0 = nh[node_mbuf_priv1(mbuf0, dyn)->nh].tx_node;\n \t\tip0 = (struct rte_ipv4_hdr *)((uint8_t *)d0 +\n \t\t\t\t\t      sizeof(struct rte_ether_hdr));\n-\t\tchksum = node_mbuf_priv1(mbuf0)->cksum +\n+\t\tchksum = node_mbuf_priv1(mbuf0, dyn)->cksum +\n \t\t\t rte_cpu_to_be_16(0x0100);\n \t\tchksum += chksum >= 0xffff;\n \t\tip0->hdr_checksum = chksum;\n-\t\tip0->time_to_live = node_mbuf_priv1(mbuf0)->ttl - 1;\n+\t\tip0->time_to_live = node_mbuf_priv1(mbuf0, dyn)->ttl - 1;\n \n \t\tif (unlikely(next_index ^ next0)) {\n \t\t\t/* Copy things successfully speculated till now */\n@@ -240,7 +254,7 @@ ip4_rewrite_node_process(struct rte_graph *graph, struct rte_node *node,\n \trte_memcpy(to_next, from, last_spec * sizeof(from[0]));\n \trte_node_next_stream_put(graph, node, next_index, held);\n \t/* Save the last next used */\n-\t*(uint16_t *)node->ctx = next_index;\n+\tIP4_REWRITE_NODE_LAST_NEXT(node->ctx) = next_index;\n \n \treturn nb_objs;\n }\n@@ -248,9 +262,20 @@ ip4_rewrite_node_process(struct rte_graph *graph, struct rte_node *node,\n static int\n ip4_rewrite_node_init(const struct rte_graph *graph, struct rte_node *node)\n {\n+\tstatic bool init_once;\n \n \tRTE_SET_USED(graph);\n-\tRTE_SET_USED(node);\n+\tRTE_BUILD_BUG_ON(sizeof(struct ip4_rewrite_node_ctx) > RTE_NODE_CTX_SZ);\n+\n+\tif (!init_once) {\n+\t\tnode_mbuf_priv1_dynfield_offset = rte_mbuf_dynfield_register(\n+\t\t\t\t&node_mbuf_priv1_dynfield_desc);\n+\t\tif (node_mbuf_priv1_dynfield_offset < 0)\n+\t\t\treturn -rte_errno;\n+\t\tinit_once = true;\n+\t}\n+\tIP4_REWRITE_NODE_PRIV1_OFF(node->ctx) = node_mbuf_priv1_dynfield_offset;\n+\n \tnode_dbg(\"ip4_rewrite\", \"Initialized ip4_rewrite node initialized\");\n \n \treturn 0;\ndiff --git a/lib/librte_node/node_private.h b/lib/librte_node/node_private.h\nindex ab7941c12b..8c73d5dc10 100644\n--- a/lib/librte_node/node_private.h\n+++ b/lib/librte_node/node_private.h\n@@ -8,6 +8,7 @@\n #include <rte_common.h>\n #include <rte_log.h>\n #include <rte_mbuf.h>\n+#include <rte_mbuf_dyn.h>\n \n extern int rte_node_logtype;\n #define NODE_LOG(level, node_name, ...)                                        \\\n@@ -21,7 +22,6 @@ extern int rte_node_logtype;\n #define node_dbg(node_name, ...) NODE_LOG(DEBUG, node_name, __VA_ARGS__)\n \n /**\n- *\n  * Node mbuf private data to store next hop, ttl and checksum.\n  */\n struct node_mbuf_priv1 {\n@@ -37,6 +37,13 @@ struct node_mbuf_priv1 {\n \t};\n };\n \n+static const struct rte_mbuf_dynfield node_mbuf_priv1_dynfield_desc = {\n+\t.name = \"rte_node_dynfield_priv1\",\n+\t.size = sizeof(struct node_mbuf_priv1),\n+\t.align = __alignof__(struct node_mbuf_priv1),\n+};\n+extern int node_mbuf_priv1_dynfield_offset;\n+\n /**\n  * Node mbuf private area 2.\n  */\n@@ -58,9 +65,9 @@ struct node_mbuf_priv2 {\n  *   Pointer to the mbuf_priv1.\n  */\n static __rte_always_inline struct node_mbuf_priv1 *\n-node_mbuf_priv1(struct rte_mbuf *m)\n+node_mbuf_priv1(struct rte_mbuf *m, const int offset)\n {\n-\treturn (struct node_mbuf_priv1 *)&m->udata64;\n+\treturn RTE_MBUF_DYNFIELD(m, offset, struct node_mbuf_priv1 *);\n }\n \n /**\n",
    "prefixes": [
        "v4",
        "04/15"
    ]
}