Provided by: dpdk-doc_24.11.2-2_all bug

NAME

       rte_mempool.h

SYNOPSIS

       #include <stdalign.h>
       #include <stdio.h>
       #include <stdint.h>
       #include <inttypes.h>
       #include <rte_compat.h>
       #include <rte_config.h>
       #include <rte_spinlock.h>
       #include <rte_debug.h>
       #include <rte_lcore.h>
       #include <rte_log.h>
       #include <rte_branch_prediction.h>
       #include <rte_ring.h>
       #include <rte_memcpy.h>
       #include <rte_common.h>
       #include 'rte_mempool_trace_fp.h'

   Data Structures
       struct rte_mempool_cache
       struct rte_mempool_objsz
       struct rte_mempool_objhdr
       struct rte_mempool_memhdr
       struct rte_mempool_info
       struct rte_mempool
       struct rte_mempool_ops
       struct rte_mempool_ops_table
       struct rte_mempool_mem_range_info

   Macros
       #define RTE_MEMPOOL_HEADER_COOKIE1   0xbadbadbadadd2e55ULL
       #define RTE_MEMPOOL_HEADER_COOKIE2   0xf2eef2eedadd2e55ULL
       #define RTE_MEMPOOL_TRAILER_COOKIE   0xadd2e55badbadbadULL
       #define RTE_MEMPOOL_ALIGN   RTE_CACHE_LINE_SIZE
       #define RTE_MEMPOOL_F_NO_SPREAD   0x0001
       #define MEMPOOL_F_NO_SPREAD   RTE_MEMPOOL_F_NO_SPREAD
       #define RTE_MEMPOOL_F_NO_CACHE_ALIGN   0x0002
       #define MEMPOOL_F_NO_CACHE_ALIGN   RTE_MEMPOOL_F_NO_CACHE_ALIGN
       #define RTE_MEMPOOL_F_SP_PUT   0x0004
       #define MEMPOOL_F_SP_PUT   RTE_MEMPOOL_F_SP_PUT
       #define RTE_MEMPOOL_F_SC_GET   0x0008
       #define MEMPOOL_F_SC_GET   RTE_MEMPOOL_F_SC_GET
       #define RTE_MEMPOOL_F_POOL_CREATED   0x0010
       #define RTE_MEMPOOL_F_NO_IOVA_CONTIG   0x0020
       #define MEMPOOL_F_NO_IOVA_CONTIG   RTE_MEMPOOL_F_NO_IOVA_CONTIG
       #define RTE_MEMPOOL_F_NON_IO   0x0040
       #define RTE_MEMPOOL_VALID_USER_FLAGS
       #define RTE_MEMPOOL_OPS_NAMESIZE   32
       #define RTE_MEMPOOL_POPULATE_F_ALIGN_OBJ   0x0001
       #define RTE_MEMPOOL_MAX_OPS_IDX   16
       #define RTE_MEMPOOL_REGISTER_OPS(ops)

   Typedefs
       typedef void() rte_mempool_memchunk_free_cb_t(struct rte_mempool_memhdr *memhdr, void *opaque)
       typedef int(* rte_mempool_alloc_t) (struct rte_mempool *mp)
       typedef void(* rte_mempool_free_t) (struct rte_mempool *mp)
       typedef int(* rte_mempool_enqueue_t) (struct rte_mempool *mp, void *const *obj_table, unsigned int n)
       typedef int(* rte_mempool_dequeue_t) (struct rte_mempool *mp, void **obj_table, unsigned int n)
       typedef int(* rte_mempool_dequeue_contig_blocks_t) (struct rte_mempool *mp, void **first_obj_table,
           unsigned int n)
       typedef unsigned(* rte_mempool_get_count) (const struct rte_mempool *mp)
       typedef ssize_t(* rte_mempool_calc_mem_size_t) (const struct rte_mempool *mp, uint32_t obj_num, uint32_t
           pg_shift, size_t *min_chunk_size, size_t *align)
       typedef void() rte_mempool_populate_obj_cb_t(struct rte_mempool *mp, void *opaque, void *vaddr,
           rte_iova_t iova)
       typedef int(* rte_mempool_populate_t) (struct rte_mempool *mp, unsigned int max_objs, void *vaddr,
           rte_iova_t iova, size_t len, rte_mempool_populate_obj_cb_t *obj_cb, void *obj_cb_arg)
       typedef int(* rte_mempool_get_info_t) (const struct rte_mempool *mp, struct rte_mempool_info *info)
       typedef void() rte_mempool_obj_cb_t(struct rte_mempool *mp, void *opaque, void *obj, unsigned obj_idx)
       typedef void() rte_mempool_mem_cb_t(struct rte_mempool *mp, void *opaque, struct rte_mempool_memhdr
           *memhdr, unsigned mem_idx)
       typedef void() rte_mempool_ctor_t(struct rte_mempool *, void *)

   Enumerations
       enum rte_mempool_event { RTE_MEMPOOL_EVENT_READY = 0, RTE_MEMPOOL_EVENT_DESTROY = 1 }

   Functions
       RTE_STAILQ_HEAD (rte_mempool_objhdr_list, rte_mempool_objhdr)
       RTE_STAILQ_HEAD (rte_mempool_memhdr_list, rte_mempool_memhdr)
       static struct rte_mempool * rte_mempool_from_obj (void *obj)
       ssize_t rte_mempool_op_calc_mem_size_default (const struct rte_mempool *mp, uint32_t obj_num, uint32_t
           pg_shift, size_t *min_chunk_size, size_t *align)
       int rte_mempool_op_populate_default (struct rte_mempool *mp, unsigned int max_objs, void *vaddr,
           rte_iova_t iova, size_t len, rte_mempool_populate_obj_cb_t *obj_cb, void *obj_cb_arg)
       int rte_mempool_ops_get_info (const struct rte_mempool *mp, struct rte_mempool_info *info)
       int rte_mempool_set_ops_byname (struct rte_mempool *mp, const char *name, void *pool_config)
       int rte_mempool_register_ops (const struct rte_mempool_ops *ops)
       struct rte_mempool * rte_mempool_create (const char *name, unsigned n, unsigned elt_size, unsigned
           cache_size, unsigned private_data_size, rte_mempool_ctor_t *mp_init, void *mp_init_arg,
           rte_mempool_obj_cb_t *obj_init, void *obj_init_arg, int socket_id, unsigned flags)
       struct rte_mempool * rte_mempool_create_empty (const char *name, unsigned n, unsigned elt_size, unsigned
           cache_size, unsigned private_data_size, int socket_id, unsigned flags)
       void rte_mempool_free (struct rte_mempool *mp)
       int rte_mempool_populate_iova (struct rte_mempool *mp, char *vaddr, rte_iova_t iova, size_t len,
           rte_mempool_memchunk_free_cb_t *free_cb, void *opaque)
       int rte_mempool_populate_virt (struct rte_mempool *mp, char *addr, size_t len, size_t pg_sz,
           rte_mempool_memchunk_free_cb_t *free_cb, void *opaque)
       int rte_mempool_populate_default (struct rte_mempool *mp)
       int rte_mempool_populate_anon (struct rte_mempool *mp)
       uint32_t rte_mempool_obj_iter (struct rte_mempool *mp, rte_mempool_obj_cb_t *obj_cb, void *obj_cb_arg)
       uint32_t rte_mempool_mem_iter (struct rte_mempool *mp, rte_mempool_mem_cb_t *mem_cb, void *mem_cb_arg)
       void rte_mempool_dump (FILE *f, struct rte_mempool *mp)
       struct rte_mempool_cache * rte_mempool_cache_create (uint32_t size, int socket_id)
       void rte_mempool_cache_free (struct rte_mempool_cache *cache)
       static __rte_always_inline struct rte_mempool_cache * rte_mempool_default_cache (struct rte_mempool *mp,
           unsigned lcore_id)
       static __rte_always_inline void rte_mempool_cache_flush (struct rte_mempool_cache *cache, struct
           rte_mempool *mp)
       static __rte_always_inline void rte_mempool_generic_put (struct rte_mempool *mp, void *const *obj_table,
           unsigned int n, struct rte_mempool_cache *cache)
       static __rte_always_inline void rte_mempool_put_bulk (struct rte_mempool *mp, void *const *obj_table,
           unsigned int n)
       static __rte_always_inline void rte_mempool_put (struct rte_mempool *mp, void *obj)
       static __rte_always_inline int rte_mempool_generic_get (struct rte_mempool *mp, void **obj_table,
           unsigned int n, struct rte_mempool_cache *cache)
       static __rte_always_inline int rte_mempool_get_bulk (struct rte_mempool *mp, void **obj_table, unsigned
           int n)
       static __rte_always_inline int rte_mempool_get (struct rte_mempool *mp, void **obj_p)
       static __rte_always_inline int rte_mempool_get_contig_blocks (struct rte_mempool *mp, void
           **first_obj_table, unsigned int n)
       unsigned int rte_mempool_avail_count (const struct rte_mempool *mp)
       unsigned int rte_mempool_in_use_count (const struct rte_mempool *mp)
       static int rte_mempool_full (const struct rte_mempool *mp)
       static int rte_mempool_empty (const struct rte_mempool *mp)
       static rte_iova_t rte_mempool_virt2iova (const void *elt)
       void rte_mempool_audit (struct rte_mempool *mp)
       static void * rte_mempool_get_priv (struct rte_mempool *mp)
       void rte_mempool_list_dump (FILE *f)
       struct rte_mempool * rte_mempool_lookup (const char *name)
       uint32_t rte_mempool_calc_obj_size (uint32_t elt_size, uint32_t flags, struct rte_mempool_objsz *sz)
       void rte_mempool_walk (void(*func)(struct rte_mempool *, void *arg), void *arg)
       __rte_experimental int rte_mempool_get_mem_range (const struct rte_mempool *mp, struct
           rte_mempool_mem_range_info *mem_range)
       __rte_experimental size_t rte_mempool_get_obj_alignment (const struct rte_mempool *mp)

   Variables
       struct rte_mempool_ops_table rte_mempool_ops_table

Detailed Description

       RTE Mempool.

       A memory pool is an allocator of fixed-size object. It is identified by its name, and uses a ring to
       store free objects. It provides some other optional services, like a per-core object cache, and an
       alignment helper to ensure that objects are padded to spread them equally on all RAM channels, ranks, and
       so on.

       Objects owned by a mempool should never be added in another mempool. When an object is freed using
       rte_mempool_put() or equivalent, the object data is not modified; the user can save some meta-data in the
       object data and retrieve them when allocating a new object.

       Note: the mempool implementation is not preemptible. An lcore must not be interrupted by another task
       that uses the same mempool (because it uses a ring which is not preemptible). Also, usual mempool
       functions like rte_mempool_get() or rte_mempool_put() are designed to be called from an EAL thread due to
       the internal per-lcore cache. Due to the lack of caching, rte_mempool_get() or rte_mempool_put()
       performance will suffer when called by unregistered non-EAL threads. Instead, unregistered non-EAL
       threads should call rte_mempool_generic_get() or rte_mempool_generic_put() with a user cache created with
       rte_mempool_cache_create().

       Definition in file rte_mempool.h.

Macro Definition Documentation

   #define RTE_MEMPOOL_HEADER_COOKIE1   0xbadbadbadadd2e55ULL
       Header cookie.

       Definition at line 59 of file rte_mempool.h.

   #define RTE_MEMPOOL_HEADER_COOKIE2   0xf2eef2eedadd2e55ULL
       Header cookie.

       Definition at line 60 of file rte_mempool.h.

   #define RTE_MEMPOOL_TRAILER_COOKIE   0xadd2e55badbadbadULL
       Trailer cookie.

       Definition at line 61 of file rte_mempool.h.

   #define RTE_MEMPOOL_ALIGN   RTE_CACHE_LINE_SIZE
       Alignment of elements inside mempool.

       Definition at line 139 of file rte_mempool.h.

   #define RTE_MEMPOOL_F_NO_SPREAD   0x0001
       Spreading among memory channels not required.

       Definition at line 275 of file rte_mempool.h.

   #define MEMPOOL_F_NO_SPREAD   RTE_MEMPOOL_F_NO_SPREAD
       Backward compatibility synonym for RTE_MEMPOOL_F_NO_SPREAD. To be deprecated.

       Definition at line 280 of file rte_mempool.h.

   #define RTE_MEMPOOL_F_NO_CACHE_ALIGN   0x0002
       Do not align objects on cache lines.

       Definition at line 282 of file rte_mempool.h.

   #define MEMPOOL_F_NO_CACHE_ALIGN   RTE_MEMPOOL_F_NO_CACHE_ALIGN
       Backward compatibility synonym for RTE_MEMPOOL_F_NO_CACHE_ALIGN. To be deprecated.

       Definition at line 287 of file rte_mempool.h.

   #define RTE_MEMPOOL_F_SP_PUT   0x0004
       Default put is 'single-producer'.

       Definition at line 289 of file rte_mempool.h.

   #define MEMPOOL_F_SP_PUT   RTE_MEMPOOL_F_SP_PUT
       Backward compatibility synonym for RTE_MEMPOOL_F_SP_PUT. To be deprecated.

       Definition at line 294 of file rte_mempool.h.

   #define RTE_MEMPOOL_F_SC_GET   0x0008
       Default get is 'single-consumer'.

       Definition at line 296 of file rte_mempool.h.

   #define MEMPOOL_F_SC_GET   RTE_MEMPOOL_F_SC_GET
       Backward compatibility synonym for RTE_MEMPOOL_F_SC_GET. To be deprecated.

       Definition at line 301 of file rte_mempool.h.

   #define RTE_MEMPOOL_F_POOL_CREATED   0x0010
       Internal: pool is created.

       Definition at line 303 of file rte_mempool.h.

   #define RTE_MEMPOOL_F_NO_IOVA_CONTIG   0x0020
       Don't need IOVA contiguous objects.

       Definition at line 305 of file rte_mempool.h.

   #define MEMPOOL_F_NO_IOVA_CONTIG   RTE_MEMPOOL_F_NO_IOVA_CONTIG
       Backward compatibility synonym for RTE_MEMPOOL_F_NO_IOVA_CONTIG. To be deprecated.

       Definition at line 310 of file rte_mempool.h.

   #define RTE_MEMPOOL_F_NON_IO   0x0040
       Internal: no object from the pool can be used for device IO (DMA).

       Definition at line 312 of file rte_mempool.h.

   #define RTE_MEMPOOL_VALID_USER_FLAGS
       Value:.PP
           (RTE_MEMPOOL_F_NO_SPREAD \
           | RTE_MEMPOOL_F_NO_CACHE_ALIGN \
           | RTE_MEMPOOL_F_SP_PUT \
           | RTE_MEMPOOL_F_SC_GET \
           | RTE_MEMPOOL_F_NO_IOVA_CONTIG \
           )
       This macro lists all the mempool flags an application may request.

       Definition at line 317 of file rte_mempool.h.

   #define RTE_MEMPOOL_OPS_NAMESIZE   32
       Max length of ops struct name.

       Definition at line 458 of file rte_mempool.h.

   #define RTE_MEMPOOL_POPULATE_F_ALIGN_OBJ   0x0001
       Align objects on addresses multiple of total_elt_sz.

       Definition at line 634 of file rte_mempool.h.

   #define RTE_MEMPOOL_MAX_OPS_IDX   16
       Max registered ops structs

       Definition at line 719 of file rte_mempool.h.

   #define RTE_MEMPOOL_REGISTER_OPS(ops)
       Value:.PP
           RTE_INIT(mp_hdlr_init_##ops)                \
           {                           \
               rte_mempool_register_ops(&ops);         \
           }
       Macro to statically register the ops of a mempool handler. Note that the rte_mempool_register_ops fails
       silently here when more than RTE_MEMPOOL_MAX_OPS_IDX is registered.

       Definition at line 983 of file rte_mempool.h.

Typedef Documentation

   typedef void() rte_mempool_memchunk_free_cb_t(struct rte_mempool_memhdr *memhdr, void *opaque)
       Callback used to free a memory chunk

       Definition at line 197 of file rte_mempool.h.

   typedef int(* rte_mempool_alloc_t) (struct rte_mempool *mp)
       Prototype for implementation specific data provisioning function.

       The function should provide the implementation specific memory for use by the other mempool ops functions
       in a given mempool ops struct. E.g. the default ops provides an instance of the rte_ring for this
       purpose. it will most likely point to a different type of data structure, and will be transparent to the
       application programmer. This function should set mp->pool_data.

       Definition at line 470 of file rte_mempool.h.

   typedef void(* rte_mempool_free_t) (struct rte_mempool *mp)
       Free the opaque private data pointed to by mp->pool_data pointer.

       Definition at line 475 of file rte_mempool.h.

   typedef int(* rte_mempool_enqueue_t) (struct rte_mempool *mp, void *const *obj_table, unsigned int n)
       Enqueue 'n' objects into the external pool.

       Returns

           • 0: Success

           • <0: Error

       Definition at line 483 of file rte_mempool.h.

   typedef int(* rte_mempool_dequeue_t) (struct rte_mempool *mp, void **obj_table, unsigned int n)
       Dequeue 'n' objects from the external pool.

       Returns

           • 0: Success

           • <0: Error

       Definition at line 492 of file rte_mempool.h.

   typedef  int(* rte_mempool_dequeue_contig_blocks_t) (struct rte_mempool *mp, void **first_obj_table, unsigned
       int n)
       Dequeue a number of contiguous object blocks from the external pool.

       Definition at line 498 of file rte_mempool.h.

   typedef unsigned(* rte_mempool_get_count) (const struct rte_mempool *mp)
       Return the number of available objects in the external pool.

       Definition at line 504 of file rte_mempool.h.

   typedef ssize_t(* rte_mempool_calc_mem_size_t) (const struct  rte_mempool  *mp,  uint32_t  obj_num,  uint32_t
       pg_shift, size_t *min_chunk_size, size_t *align)
       Calculate memory size required to store given number of objects.

       If mempool objects are not required to be IOVA-contiguous (the flag RTE_MEMPOOL_F_NO_IOVA_CONTIG is set),
       min_chunk_size  defines  virtually  contiguous  chunk  size.  Otherwise, if mempool objects must be IOVA-
       contiguous (the flag RTE_MEMPOOL_F_NO_IOVA_CONTIG is clear), min_chunk_size defines IOVA-contiguous chunk
       size.

       Parameters
           mp Pointer to the memory pool.
           obj_num Number of objects.
           pg_shift LOG2 of the physical pages size. If set to 0, ignore page boundaries.
           min_chunk_size Location for minimum size of the memory chunk which may be used to store  memory  pool
           objects.
           align Location for required memory chunk alignment.

       Returns
           Required memory size.

       Definition at line 529 of file rte_mempool.h.

   typedef  void()  rte_mempool_populate_obj_cb_t(struct  rte_mempool *mp, void *opaque, void *vaddr, rte_iova_t
       iova)
       Function to be called for each populated object.

       Parameters
           mp A pointer to the mempool structure.
           opaque An opaque pointer passed to iterator.
           vaddr Object virtual address.
           iova Input/output virtual address of the object or RTE_BAD_IOVA.

       Definition at line 595 of file rte_mempool.h.

   typedef int(* rte_mempool_populate_t) (struct rte_mempool *mp, unsigned int max_objs, void *vaddr, rte_iova_t
       iova, size_t len, rte_mempool_populate_obj_cb_t *obj_cb, void *obj_cb_arg)
       Populate memory pool objects using provided memory chunk.

       Populated objects should be enqueued to the pool, e.g. using rte_mempool_ops_enqueue_bulk().

       If the given IO address is unknown (iova =  RTE_BAD_IOVA),  the  chunk  doesn't  need  to  be  physically
       contiguous (only virtually), and allocated objects may span two pages.

       Parameters
           mp A pointer to the mempool structure.
           max_objs Maximum number of objects to be populated.
           vaddr The virtual address of memory that should be used to store objects.
           iova The IO address
           len The length of memory in bytes.
           obj_cb Callback function to be executed for each populated object.
           obj_cb_arg An opaque pointer passed to the callback function.

       Returns
           The  number  of  objects added on success. On error, no objects are populated and a negative errno is
           returned.

       Definition at line 626 of file rte_mempool.h.

   typedef int(* rte_mempool_get_info_t) (const struct rte_mempool *mp, struct rte_mempool_info *info)
       Get some additional information about a mempool.

       Definition at line 687 of file rte_mempool.h.

   typedef void() rte_mempool_obj_cb_t(struct rte_mempool *mp, void *opaque, void *obj, unsigned obj_idx)
       An object callback function for mempool.

       Used by rte_mempool_create() and rte_mempool_obj_iter().

       Definition at line 994 of file rte_mempool.h.

   typedef void() rte_mempool_mem_cb_t(struct rte_mempool *mp, void *opaque, struct rte_mempool_memhdr  *memhdr,
       unsigned mem_idx)
       A memory callback function for mempool.

       Used by rte_mempool_mem_iter().

       Definition at line 1003 of file rte_mempool.h.

   typedef void() rte_mempool_ctor_t(struct rte_mempool *, void *)
       A mempool constructor callback function.

       Arguments are the mempool and the opaque pointer given by the user in rte_mempool_create().

       Definition at line 1013 of file rte_mempool.h.

Enumeration Type Documentation

   enum rte_mempool_event
       Mempool event type.

       Enumerator

       RTE_MEMPOOL_EVENT_READY
              Occurs after a mempool is fully populated.

       RTE_MEMPOOL_EVENT_DESTROY
              Occurs before the destruction of a mempool begins.

       Definition at line 1979 of file rte_mempool.h.

Function Documentation

   RTE_STAILQ_HEAD (rte_mempool_objhdr_list, rte_mempool_objhdr)
       A list of object headers type

   RTE_STAILQ_HEAD (rte_mempool_memhdr_list, rte_mempool_memhdr)
       A list of memory where objects are stored

   static struct rte_mempool * rte_mempool_from_obj (void * obj) [inline],  [static]
       Return a pointer to the mempool owning this object.

       Parameters
           obj An object that is owned by a pool. If this is not the case, the behavior is undefined.

       Returns
           A pointer to the mempool structure.

       Definition at line 392 of file rte_mempool.h.

   ssize_t  rte_mempool_op_calc_mem_size_default  (const  struct  rte_mempool  *  mp, uint32_t obj_num, uint32_t
       pg_shift, size_t * min_chunk_size, size_t * align)
       Default way to calculate memory size required to store given number of objects.

       Equivalent to rte_mempool_op_calc_mem_size_helper(mp, obj_num, pg_shift, 0, min_chunk_size, align).

   int rte_mempool_op_populate_default (struct rte_mempool * mp, unsigned int max_objs, void * vaddr, rte_iova_t
       iova, size_t len, rte_mempool_populate_obj_cb_t * obj_cb, void * obj_cb_arg)
       Default way to populate memory pool object using provided memory chunk.

       Equivalent to rte_mempool_op_populate_helper(mp, 0, max_objs, vaddr, iova, len, obj_cb, obj_cb_arg).

   int rte_mempool_ops_get_info (const struct rte_mempool * mp, struct rte_mempool_info * info)
       Wrapper for mempool_ops get_info callback.

       Parameters
           mp Pointer to the memory pool.
           info Pointer to the rte_mempool_info structure

       Returns

           • 0: Success; The mempool driver supports retrieving supplementary mempool information

           • -ENOTSUP - doesn't support get_info ops (valid case).

   int rte_mempool_set_ops_byname (struct rte_mempool * mp, const char * name, void * pool_config)
       Set the ops of a mempool.

       This  can  only  be  done  on  a  mempool  that  is  not  populated,  i.e.   just   after   a   call   to
       rte_mempool_create_empty().

       Parameters
           mp Pointer to the memory pool.
           name Name of the ops structure to use for this mempool.
           pool_config Opaque data that can be passed by the application to the ops functions.

       Returns

           • 0: Success; the mempool is now using the requested ops functions.

           • -EINVAL - Invalid ops struct name provided.

           • -EEXIST - mempool already has an ops struct assigned.

   int rte_mempool_register_ops (const struct rte_mempool_ops * ops)
       Register mempool operations.

       Parameters
           ops Pointer to an ops structure to register.

       Returns

           • >=0: Success; return the index of the ops struct in the table.

           • -EINVAL - some missing callbacks while registering ops struct.

           • -ENOSPC - the maximum number of ops structs has been reached.

   struct  rte_mempool  *  rte_mempool_create  (const  char  *  name,  unsigned  n,  unsigned elt_size, unsigned
       cache_size,   unsigned   private_data_size,   rte_mempool_ctor_t   *   mp_init,   void   *   mp_init_arg,
       rte_mempool_obj_cb_t * obj_init, void * obj_init_arg, int socket_id, unsigned flags)
       Create a new mempool named name in memory.

       This  function  uses  rte_memzone_reserve() to allocate memory. The pool contains n elements of elt_size.
       Its size is set to n.

       Parameters
           name The name of the mempool.
           n The number of elements in the mempool. The optimum size (in terms of memory usage) for a mempool is
           when n is a power of two minus one: n = (2^q - 1).
           elt_size The size of each element.
           cache_size If cache_size is non-zero, the rte_mempool library will try to limit the accesses  to  the
           common  lockless  pool, by maintaining a per-lcore object cache. This argument must be lower or equal
           to RTE_MEMPOOL_CACHE_MAX_SIZE and n / 1.5. It is advised to  choose  cache_size  to  have  'n  modulo
           cache_size  == 0': if this is not the case, some elements will always stay in the pool and will never
           be used. The access to the per-lcore table is of course faster than the multi-producer/consumer pool.
           The cache can be disabled if the cache_size argument is set to 0; it can be useful  to  avoid  losing
           objects in cache.
           private_data_size  The  size of the private data appended after the mempool structure. This is useful
           for storing some private data after the mempool structure, as is done for rte_mbuf_pool for example.
           mp_init  A  function  pointer  that  is  called  for  initialization  of  the  pool,  before   object
           initialization.  The  user can initialize the private data in this function if needed. This parameter
           can be NULL if not needed.
           mp_init_arg An opaque pointer to data that can be used in the mempool constructor function.
           obj_init A function pointer that is called for each object at initialization of the  pool.  The  user
           can set some meta data in objects if needed. This parameter can be NULL if not needed. The obj_init()
           function  takes  the  mempool  pointer,  the  init_arg,  the  object pointer and the object number as
           parameters.
           obj_init_arg An opaque pointer to data that can be used as an argument for each call  to  the  object
           constructor function.
           socket_id  The  socket_id  argument  is  the  socket identifier in the case of NUMA. The value can be
           SOCKET_ID_ANY if there is no NUMA constraint for the reserved zone.
           flags The flags arguments is an OR of following flags:

           • RTE_MEMPOOL_F_NO_SPREAD: By default, objects addresses are spread between channels in RAM: the pool
             allocator will add padding between objects depending on  the  hardware  configuration.  See  Memory
             alignment  constraints  for  details.  If this flag is set, the allocator will just align them to a
             cache line.

           • RTE_MEMPOOL_F_NO_CACHE_ALIGN: By default, the returned objects are cache-aligned. This flag removes
             this  constraint,  and  no  padding  will  be  present   between   objects.   This   flag   implies
             RTE_MEMPOOL_F_NO_SPREAD.

           • RTE_MEMPOOL_F_SP_PUT:  If  this  flag  is set, the default behavior when using rte_mempool_put() or
             rte_mempool_put_bulk() is 'single-producer'. Otherwise, it is 'multi-producers'.

           • RTE_MEMPOOL_F_SC_GET: If this flag is set, the default behavior  when  using  rte_mempool_get()  or
             rte_mempool_get_bulk() is 'single-consumer'. Otherwise, it is 'multi-consumers'.

           • RTE_MEMPOOL_F_NO_IOVA_CONTIG:  If  set,  allocated  objects  won't  necessarily be contiguous in IO
             memory.

       Returns
           The pointer to the new allocated mempool, on success. NULL on error with rte_errno set appropriately.
           Possible rte_errno values include:

           • E_RTE_NO_CONFIG - function could not get pointer to rte_config structure

           • EINVAL - cache size provided is too large or an unknown flag was passed

           • ENOSPC - the maximum number of memzones has already been allocated

           • EEXIST - a memzone with the same name already exists

           • ENOMEM - no appropriate memory area found in which to create memzone

   struct rte_mempool * rte_mempool_create_empty (const char * name, unsigned  n,  unsigned  elt_size,  unsigned
       cache_size, unsigned private_data_size, int socket_id, unsigned flags)
       Create an empty mempool

       The mempool is allocated and initialized, but it is not populated: no memory is allocated for the mempool
       elements. The user has to call rte_mempool_populate_*() to add memory chunks to the pool. Once populated,
       the user may also want to initialize each object with rte_mempool_obj_iter().

       Parameters
           name The name of the mempool.
           n  The  maximum  number  of  elements that can be added in the mempool. The optimum size (in terms of
           memory usage) for a mempool is when n is a power of two minus one: n = (2^q - 1).
           elt_size The size of each element.
           cache_size Size of the cache. See rte_mempool_create() for details.
           private_data_size The size of the private data appended after the mempool structure. This  is  useful
           for storing some private data after the mempool structure, as is done for rte_mbuf_pool for example.
           socket_id  The  socket_id  argument  is  the  socket identifier in the case of NUMA. The value can be
           SOCKET_ID_ANY if there is no NUMA constraint for the reserved zone.
           flags Flags controlling the behavior of the mempool. See rte_mempool_create() for details.

       Returns
           The pointer to the new allocated mempool, on success. NULL on error with rte_errno set appropriately.
           See rte_mempool_create() for details.

   void rte_mempool_free (struct rte_mempool * mp)
       Free a mempool

       Unlink the mempool from global list, free the memory chunks, and all memory referenced  by  the  mempool.
       The objects must not be used by other cores as they will be freed.

       Parameters
           mp A pointer to the mempool structure. If NULL then, the function does nothing.

   int  rte_mempool_populate_iova  (struct  rte_mempool  *  mp,  char  *  vaddr,  rte_iova_t  iova,  size_t len,
       rte_mempool_memchunk_free_cb_t * free_cb, void * opaque)
       Add physically contiguous memory for objects in the pool at init

       Add a virtually and physically contiguous memory chunk in the pool where objects can be instantiated.

       If the given IO address is unknown (iova =  RTE_BAD_IOVA),  the  chunk  doesn't  need  to  be  physically
       contiguous (only virtually), and allocated objects may span two pages.

       Parameters
           mp A pointer to the mempool structure.
           vaddr The virtual address of memory that should be used to store objects.
           iova The IO address
           len The length of memory in bytes.
           free_cb The callback used to free this chunk when destroying the mempool.
           opaque An opaque argument passed to free_cb.

       Returns
           The  number  of objects added on success (strictly positive). On error, the chunk is not added in the
           memory list of the mempool the following code is returned: (0): not enough  room  in  chunk  for  one
           object. (-ENOSPC): mempool is already populated. (-ENOMEM): allocation failure.

   int   rte_mempool_populate_virt   (struct   rte_mempool  *  mp,  char  *  addr,  size_t  len,  size_t  pg_sz,
       rte_mempool_memchunk_free_cb_t * free_cb, void * opaque)
       Add virtually contiguous memory for objects in the pool at init

       Add a virtually contiguous memory chunk in the pool where objects can be instantiated.

       Parameters
           mp A pointer to the mempool structure.
           addr The virtual address of memory that should be used to store objects.
           len The length of memory in bytes.
           pg_sz The size of memory pages in this virtual area.
           free_cb The callback used to free this chunk when destroying the mempool.
           opaque An opaque argument passed to free_cb.

       Returns
           The number of objects added on success (strictly positive). On error, the chunk is not added  in  the
           memory  list  of  the  mempool  the following code is returned: (0): not enough room in chunk for one
           object. (-ENOSPC): mempool is already populated. (-ENOMEM): allocation failure.

   int rte_mempool_populate_default (struct rte_mempool * mp)
       Add memory for objects in the pool at init

       This is the default function used by  rte_mempool_create()  to  populate  the  mempool.  It  adds  memory
       allocated using rte_memzone_reserve().

       Parameters
           mp A pointer to the mempool structure.

       Returns
           The  number  of  objects added on success. On error, the chunk is not added in the memory list of the
           mempool and a negative errno is returned.

   int rte_mempool_populate_anon (struct rte_mempool * mp)
       Add memory from anonymous mapping for objects in the pool at init

       This function mmap an anonymous memory zone that is locked in memory to store the objects of the mempool.

       Parameters
           mp A pointer to the mempool structure.

       Returns
           The number of objects added on success. On error, 0 is returned, rte_errno is set, and the  chunk  is
           not added in the memory list of the mempool.

   uint32_t rte_mempool_obj_iter (struct rte_mempool * mp, rte_mempool_obj_cb_t * obj_cb, void * obj_cb_arg)
       Call a function for each mempool element

       Iterate across all objects attached to a rte_mempool and call the callback function on it.

       Parameters
           mp A pointer to an initialized mempool.
           obj_cb A function pointer that is called for each object.
           obj_cb_arg An opaque pointer passed to the callback function.

       Returns
           Number of objects iterated.

   uint32_t rte_mempool_mem_iter (struct rte_mempool * mp, rte_mempool_mem_cb_t * mem_cb, void * mem_cb_arg)
       Call a function for each mempool memory chunk

       Iterate across all memory chunks attached to a rte_mempool and call the callback function on it.

       Parameters
           mp A pointer to an initialized mempool.
           mem_cb A function pointer that is called for each memory chunk.
           mem_cb_arg An opaque pointer passed to the callback function.

       Returns
           Number of memory chunks iterated.

   void rte_mempool_dump (FILE * f, struct rte_mempool * mp)
       Dump the status of the mempool to a file.

       Parameters
           f A pointer to a file for output
           mp A pointer to the mempool structure.

   struct rte_mempool_cache * rte_mempool_cache_create (uint32_t size, int socket_id)
       Create a user-owned mempool cache.

       This can be used by unregistered non-EAL threads to enable caching when they interact with a mempool.

       Parameters
           size  The  size of the mempool cache. See rte_mempool_create()'s cache_size parameter description for
           more information. The same limits and considerations apply here too.
           socket_id The socket identifier in the case of NUMA. The value can be SOCKET_ID_ANY if  there  is  no
           NUMA constraint for the reserved zone.

   void rte_mempool_cache_free (struct rte_mempool_cache * cache)
       Free a user-owned mempool cache.

       Parameters
           cache A pointer to the mempool cache.

   static  __rte_always_inline  struct  rte_mempool_cache  * rte_mempool_default_cache (struct rte_mempool * mp,
       unsigned lcore_id) [static]
       Get a pointer to the per-lcore default mempool cache.

       Parameters
           mp A pointer to the mempool structure.
           lcore_id The logical core id.

       Returns
           A pointer to the mempool cache or NULL if disabled or unregistered non-EAL thread.

       Definition at line 1331 of file rte_mempool.h.

   static __rte_always_inline void rte_mempool_cache_flush (struct rte_mempool_cache * cache, struct rte_mempool
       * mp) [static]
       Flush a user-owned mempool cache to the specified mempool.

       Parameters
           cache A pointer to the mempool cache.
           mp A pointer to the mempool.

       Definition at line 1353 of file rte_mempool.h.

   static __rte_always_inline void rte_mempool_generic_put (struct rte_mempool * mp, void  *const  *  obj_table,
       unsigned int n, struct rte_mempool_cache * cache) [static]
       Put several objects back in the mempool.

       Parameters
           mp A pointer to the mempool structure.
           obj_table A pointer to a table of void * pointers (objects).
           n The number of objects to add in the mempool from the obj_table.
           cache A pointer to a mempool cache structure. May be NULL if not needed.

       Definition at line 1442 of file rte_mempool.h.

   static  __rte_always_inline  void  rte_mempool_put_bulk  (struct  rte_mempool  * mp, void *const * obj_table,
       unsigned int n) [static]
       Put several objects back in the mempool.

       This function calls the multi-producer or the single-producer version depending on the  default  behavior
       that was specified at mempool creation time (see flags).

       Parameters
           mp A pointer to the mempool structure.
           obj_table A pointer to a table of void * pointers (objects).
           n The number of objects to add in the mempool from obj_table.

       Definition at line 1465 of file rte_mempool.h.

   static __rte_always_inline void rte_mempool_put (struct rte_mempool * mp, void * obj) [static]
       Put one object back in the mempool.

       This  function  calls the multi-producer or the single-producer version depending on the default behavior
       that was specified at mempool creation time (see flags).

       Parameters
           mp A pointer to the mempool structure.
           obj A pointer to the object to be added.

       Definition at line 1487 of file rte_mempool.h.

   static __rte_always_inline int rte_mempool_generic_get (struct rte_mempool * mp, void ** obj_table,  unsigned
       int n, struct rte_mempool_cache * cache) [static]
       Get several objects from the mempool.

       If  cache is enabled, objects will be retrieved first from cache, subsequently from the common pool. Note
       that it can return -ENOENT when the local cache and common pool are  empty,  even  if  cache  from  other
       lcores are full.

       Parameters
           mp A pointer to the mempool structure.
           obj_table A pointer to a table of void * pointers (objects) that will be filled.
           n The number of objects to get from mempool to obj_table.
           cache A pointer to a mempool cache structure. May be NULL if not needed.

       Returns

           • 0: Success; objects taken.

           • -ENOENT: Not enough entries in the mempool; no object is retrieved.

       Definition at line 1645 of file rte_mempool.h.

   static __rte_always_inline int rte_mempool_get_bulk (struct rte_mempool * mp, void ** obj_table, unsigned int
       n) [static]
       Get several objects from the mempool.

       This  function  calls  the  multi-consumers  or  the  single-consumer  version,  depending on the default
       behaviour that was specified at mempool creation time (see flags).

       If cache is enabled, objects will be retrieved first from cache, subsequently from the common pool.  Note
       that  it  can  return  -ENOENT  when  the local cache and common pool are empty, even if cache from other
       lcores are full.

       Parameters
           mp A pointer to the mempool structure.
           obj_table A pointer to a table of void * pointers (objects) that will be filled.
           n The number of objects to get from the mempool to obj_table.

       Returns

           • 0: Success; objects taken

           • -ENOENT: Not enough entries in the mempool; no object is retrieved.

       Definition at line 1679 of file rte_mempool.h.

   static __rte_always_inline int rte_mempool_get (struct rte_mempool * mp, void ** obj_p) [static]
       Get one object from the mempool.

       This function calls the multi-consumers or the single-consumer version, depending on the default behavior
       that was specified at mempool creation (see flags).

       If cache is enabled, objects will be retrieved first from cache, subsequently from the common pool.  Note
       that  it  can  return  -ENOENT  when  the local cache and common pool are empty, even if cache from other
       lcores are full.

       Parameters
           mp A pointer to the mempool structure.
           obj_p A pointer to a void * pointer (object) that will be filled.

       Returns

           • 0: Success; objects taken.

           • -ENOENT: Not enough entries in the mempool; no object is retrieved.

       Definition at line 1708 of file rte_mempool.h.

   static  __rte_always_inline  int  rte_mempool_get_contig_blocks   (struct   rte_mempool   *   mp,   void   **
       first_obj_table, unsigned int n) [static]
       Get a contiguous blocks of objects from the mempool.

       If cache is enabled, consider to flush it first, to reuse objects as soon as possible.

       The application should check that the driver supports the operation by calling rte_mempool_ops_get_info()
       and checking that contig_block_size is not zero.

       Parameters
           mp A pointer to the mempool structure.
           first_obj_table A pointer to a pointer to the first object in each block.
           n The number of blocks to get from mempool.

       Returns

           • 0: Success; blocks taken.

           • -ENOBUFS: Not enough entries in the mempool; no object is retrieved.

           • -EOPNOTSUPP: The mempool driver does not support block dequeue

       Definition at line 1735 of file rte_mempool.h.

   unsigned int rte_mempool_avail_count (const struct rte_mempool * mp)
       Return the number of entries in the mempool.

       When  cache is enabled, this function has to browse the length of all lcores, so it should not be used in
       a data path, but only for debug purposes. User-owned mempool caches are not accounted for.

       Parameters
           mp A pointer to the mempool structure.

       Returns
           The number of entries in the mempool.

   unsigned int rte_mempool_in_use_count (const struct rte_mempool * mp)
       Return the number of elements which have been allocated from the mempool

       When cache is enabled, this function has to browse the length of all lcores, so it should not be used  in
       a data path, but only for debug purposes.

       Parameters
           mp A pointer to the mempool structure.

       Returns
           The number of free entries in the mempool.

   static int rte_mempool_full (const struct rte_mempool * mp) [inline],  [static]
       Test if the mempool is full.

       When  cache is enabled, this function has to browse the length of all lcores, so it should not be used in
       a data path, but only for debug purposes. User-owned mempool caches are not accounted for.

       Parameters
           mp A pointer to the mempool structure.

       Returns

           • 1: The mempool is full.

           • 0: The mempool is not full.

       Definition at line 1798 of file rte_mempool.h.

   static int rte_mempool_empty (const struct rte_mempool * mp) [inline],  [static]
       Test if the mempool is empty.

       When cache is enabled, this function has to browse the length of all lcores, so it should not be used  in
       a data path, but only for debug purposes. User-owned mempool caches are not accounted for.

       Parameters
           mp A pointer to the mempool structure.

       Returns

           • 1: The mempool is empty.

           • 0: The mempool is not empty.

       Definition at line 1817 of file rte_mempool.h.

   static rte_iova_t rte_mempool_virt2iova (const void * elt) [inline],  [static]
       Return the IO address of elt, which is an element of the pool mp.

       Parameters
           elt A pointer (virtual address) to the element of the pool.

       Returns
           The  IO address of the elt element. If the mempool was created with RTE_MEMPOOL_F_NO_IOVA_CONTIG, the
           returned value is RTE_BAD_IOVA.

       Definition at line 1833 of file rte_mempool.h.

   void rte_mempool_audit (struct rte_mempool * mp)
       Check the consistency of mempool objects.

       Verify the coherency of fields in the mempool structure. Also check that the cookies of  mempool  objects
       (even the ones that are not present in pool) have a correct value. If not, a panic will occur.

       Parameters
           mp A pointer to the mempool structure.

   static void * rte_mempool_get_priv (struct rte_mempool * mp) [inline],  [static]
       Return a pointer to the private data in an mempool structure.

       Parameters
           mp A pointer to the mempool structure.

       Returns
           A pointer to the private data.

       Definition at line 1861 of file rte_mempool.h.

   void rte_mempool_list_dump (FILE * f)
       Dump the status of all mempools on the console

       Parameters
           f A pointer to a file for output

   struct rte_mempool * rte_mempool_lookup (const char * name)
       Search a mempool from its name

       Parameters
           name The name of the mempool.

       Returns
           The  pointer to the mempool matching the name, or NULL if not found. NULL on error with rte_errno set
           appropriately. Possible rte_errno values include:

           • ENOENT - required entry not available to return.

   uint32_t rte_mempool_calc_obj_size (uint32_t elt_size, uint32_t flags, struct rte_mempool_objsz * sz)
       Get the header, trailer and total size of a mempool element.

       Given a desired size of the mempool element and mempool flags, calculates header, trailer, body and total
       sizes of the mempool object.

       Parameters
           elt_size The size of each element, without header and trailer.
           flags The flags used for the mempool creation.  Consult  rte_mempool_create()  for  more  information
           about possible values. The size of each element.
           sz The calculated detailed size the mempool object. May be NULL.

       Returns
           Total size of the mempool object.

   void rte_mempool_walk (void(*)(struct rte_mempool *, void *arg) func, void * arg)
       Walk list of all memory pools

       Parameters
           func Iterator function
           arg Argument passed to iterator

   __rte_experimental    int    rte_mempool_get_mem_range    (const    struct    rte_mempool    *   mp,   struct
       rte_mempool_mem_range_info * mem_range)
       Warning
           EXPERIMENTAL: this API may change without prior notice.

       Get information about the memory range used to store objects in the mempool.

       Parameters
           mp Pointer to an initialized mempool.
           mem_range Pointer to struct which is used to return  lowest  address,  length  of  the  memory  range
           containing all the addresses, and whether these addresses are contiguous.

       Returns
           0 on success, -EINVAL if mempool is not valid or mem_range is NULL.

   __rte_experimental size_t rte_mempool_get_obj_alignment (const struct rte_mempool * mp)
       Warning
           EXPERIMENTAL: this API may change without prior notice.

       Return alignment of objects stored in the mempool.

       Parameters
           mp Pointer to a mempool.

       Returns
           Object alignment if mp is valid. 0 if mp is NULL.

Variable Documentation

   struct rte_mempool_ops_table rte_mempool_ops_table [extern]
       Array of registered ops structs.

Author

       Generated automatically by Doxygen for DPDK from the source code.

DPDK                                             Version 24.11.2                                rte_mempool.h(3)