Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(C) 2025 Marvell International Ltd. 3 : : */ 4 : : 5 : : #include <rte_memzone.h> 6 : : #include <rte_node_mbuf_dynfield.h> 7 : : #include <node_private.h> 8 : : #include <eal_export.h> 9 : : #include <rte_errno.h> 10 : : 11 : : #define NODE_MBUF_DYNFIELD_MEMZONE_NAME "__rte_node_mbuf_dynfield" 12 : : 13 : : struct node_mbuf_dynfield_mz { 14 : : int dynfield_offset; 15 : : }; 16 : : 17 : : static const struct rte_mbuf_dynfield node_mbuf_dynfield_desc = { 18 : : .name = "rte_node_mbuf_dynfield", 19 : : .size = sizeof(rte_node_mbuf_dynfield_t), 20 : : .align = alignof(rte_node_mbuf_dynfield_t), 21 : : }; 22 : : 23 : : RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_node_mbuf_dynfield_register, 25.07); 24 : 0 : int rte_node_mbuf_dynfield_register(void) 25 : : { 26 : : struct node_mbuf_dynfield_mz *f = NULL; 27 : : const struct rte_memzone *mz = NULL; 28 : : int dyn_offset; 29 : : 30 : : RTE_BUILD_BUG_ON(sizeof(rte_node_mbuf_dynfield_t) < RTE_NODE_MBUF_DYNFIELD_SIZE); 31 : : RTE_BUILD_BUG_ON(sizeof(rte_node_mbuf_overload_fields_t) < 32 : : RTE_NODE_MBUF_OVERLOADABLE_FIELDS_SIZE); 33 : : 34 : 0 : mz = rte_memzone_lookup(NODE_MBUF_DYNFIELD_MEMZONE_NAME); 35 : : 36 [ # # ]: 0 : if (!mz) { 37 : 0 : mz = rte_memzone_reserve_aligned(NODE_MBUF_DYNFIELD_MEMZONE_NAME, 38 : : sizeof(struct node_mbuf_dynfield_mz), 39 : : SOCKET_ID_ANY, 0, 40 : : RTE_CACHE_LINE_SIZE); 41 [ # # ]: 0 : if (!mz) { 42 : 0 : node_err("node_mbuf_dyn", "rte_memzone_reserve_aligned failed"); 43 : 0 : rte_errno = ENOMEM; 44 : 0 : return -1; 45 : : } 46 : 0 : dyn_offset = rte_mbuf_dynfield_register(&node_mbuf_dynfield_desc); 47 [ # # ]: 0 : if (dyn_offset < 0) { 48 : 0 : node_err("node_mbuf_dyn", "rte_mbuf_dynfield_register failed"); 49 : 0 : return dyn_offset; 50 : : } 51 : 0 : f = (struct node_mbuf_dynfield_mz *)mz->addr; 52 : 0 : f->dynfield_offset = dyn_offset; 53 : : 54 : 0 : node_dbg("node_mbuf_dyn", "memzone: %s of size: %zu at offset : %d", 55 : : mz->name, mz->len, f->dynfield_offset); 56 : : } else { 57 : 0 : f = (struct node_mbuf_dynfield_mz *)mz->addr; 58 : : } 59 : 0 : return f->dynfield_offset; 60 : : }