1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2010-2014 Intel Corporation. 3 * Copyright(c) 2016 6WIND S.A. 4 */ 5 6 #ifndef _RTE_MEMPOOL_H_ 7 #define _RTE_MEMPOOL_H_ 8 9 /** 10 * @file 11 * RTE Mempool. 12 * 13 * A memory pool is an allocator of fixed-size object. It is 14 * identified by its name, and uses a ring to store free objects. It 15 * provides some other optional services, like a per-core object 16 * cache, and an alignment helper to ensure that objects are padded 17 * to spread them equally on all RAM channels, ranks, and so on. 18 * 19 * Objects owned by a mempool should never be added in another 20 * mempool. When an object is freed using rte_mempool_put() or 21 * equivalent, the object data is not modified; the user can save some 22 * meta-data in the object data and retrieve them when allocating a 23 * new object. 24 * 25 * Note: the mempool implementation is not preemptible. An lcore must not be 26 * interrupted by another task that uses the same mempool (because it uses a 27 * ring which is not preemptible). Also, usual mempool functions like 28 * rte_mempool_get() or rte_mempool_put() are designed to be called from an EAL 29 * thread due to the internal per-lcore cache. Due to the lack of caching, 30 * rte_mempool_get() or rte_mempool_put() performance will suffer when called 31 * by unregistered non-EAL threads. Instead, unregistered non-EAL threads 32 * should call rte_mempool_generic_get() or rte_mempool_generic_put() with a 33 * user cache created with rte_mempool_cache_create(). 34 */ 35 36 #include <stdio.h> 37 #include <stdlib.h> 38 #include <stdint.h> 39 #include <errno.h> 40 #include <inttypes.h> 41 42 #include <rte_config.h> 43 #include <rte_spinlock.h> 44 #include <rte_log.h> 45 #include <rte_debug.h> 46 #include <rte_lcore.h> 47 #include <rte_memory.h> 48 #include <rte_branch_prediction.h> 49 #include <rte_ring.h> 50 #include <rte_memcpy.h> 51 #include <rte_common.h> 52 53 #include "rte_mempool_trace_fp.h" 54 55 #ifdef __cplusplus 56 extern "C" { 57 #endif 58 59 #define RTE_MEMPOOL_HEADER_COOKIE1 0xbadbadbadadd2e55ULL /**< Header cookie. */ 60 #define RTE_MEMPOOL_HEADER_COOKIE2 0xf2eef2eedadd2e55ULL /**< Header cookie. */ 61 #define RTE_MEMPOOL_TRAILER_COOKIE 0xadd2e55badbadbadULL /**< Trailer cookie.*/ 62 63 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG 64 /** 65 * A structure that stores the mempool statistics (per-lcore). 66 * Note: Cache stats (put_cache_bulk/objs, get_cache_bulk/objs) are not 67 * captured since they can be calculated from other stats. 68 * For example: put_cache_objs = put_objs - put_common_pool_objs. 69 */ 70 struct rte_mempool_debug_stats { 71 uint64_t put_bulk; /**< Number of puts. */ 72 uint64_t put_objs; /**< Number of objects successfully put. */ 73 uint64_t put_common_pool_bulk; /**< Number of bulks enqueued in common pool. */ 74 uint64_t put_common_pool_objs; /**< Number of objects enqueued in common pool. */ 75 uint64_t get_common_pool_bulk; /**< Number of bulks dequeued from common pool. */ 76 uint64_t get_common_pool_objs; /**< Number of objects dequeued from common pool. */ 77 uint64_t get_success_bulk; /**< Successful allocation number. */ 78 uint64_t get_success_objs; /**< Objects successfully allocated. */ 79 uint64_t get_fail_bulk; /**< Failed allocation number. */ 80 uint64_t get_fail_objs; /**< Objects that failed to be allocated. */ 81 uint64_t get_success_blks; /**< Successful allocation number of contiguous blocks. */ 82 uint64_t get_fail_blks; /**< Failed allocation number of contiguous blocks. */ 83 } __rte_cache_aligned; 84 #endif 85 86 /** 87 * A structure that stores a per-core object cache. 88 */ 89 struct rte_mempool_cache { 90 uint32_t size; /**< Size of the cache */ 91 uint32_t flushthresh; /**< Threshold before we flush excess elements */ 92 uint32_t len; /**< Current cache count */ 93 /* 94 * Cache is allocated to this size to allow it to overflow in certain 95 * cases to avoid needless emptying of cache. 96 */ 97 void *objs[RTE_MEMPOOL_CACHE_MAX_SIZE * 3]; /**< Cache objects */ 98 } __rte_cache_aligned; 99 100 /** 101 * A structure that stores the size of mempool elements. 102 */ 103 struct rte_mempool_objsz { 104 uint32_t elt_size; /**< Size of an element. */ 105 uint32_t header_size; /**< Size of header (before elt). */ 106 uint32_t trailer_size; /**< Size of trailer (after elt). */ 107 uint32_t total_size; 108 /**< Total size of an object (header + elt + trailer). */ 109 }; 110 111 /**< Maximum length of a memory pool's name. */ 112 #define RTE_MEMPOOL_NAMESIZE (RTE_RING_NAMESIZE - \ 113 sizeof(RTE_MEMPOOL_MZ_PREFIX) + 1) 114 #define RTE_MEMPOOL_MZ_PREFIX "MP_" 115 116 /* "MP_<name>" */ 117 #define RTE_MEMPOOL_MZ_FORMAT RTE_MEMPOOL_MZ_PREFIX "%s" 118 119 #define MEMPOOL_PG_SHIFT_MAX \ 120 RTE_DEPRECATED(MEMPOOL_PG_SHIFT_MAX) (sizeof(uintptr_t) * CHAR_BIT - 1) 121 122 /** Deprecated. Mempool over one chunk of physically continuous memory */ 123 #define MEMPOOL_PG_NUM_DEFAULT RTE_DEPRECATED(MEMPOOL_PG_NUM_DEFAULT) 1 124 125 #ifndef RTE_MEMPOOL_ALIGN 126 /** 127 * Alignment of elements inside mempool. 128 */ 129 #define RTE_MEMPOOL_ALIGN RTE_CACHE_LINE_SIZE 130 #endif 131 132 #define RTE_MEMPOOL_ALIGN_MASK (RTE_MEMPOOL_ALIGN - 1) 133 134 /** 135 * Mempool object header structure 136 * 137 * Each object stored in mempools are prefixed by this header structure, 138 * it allows to retrieve the mempool pointer from the object and to 139 * iterate on all objects attached to a mempool. When debug is enabled, 140 * a cookie is also added in this structure preventing corruptions and 141 * double-frees. 142 */ 143 struct rte_mempool_objhdr { 144 RTE_STAILQ_ENTRY(rte_mempool_objhdr) next; /**< Next in list. */ 145 struct rte_mempool *mp; /**< The mempool owning the object. */ 146 rte_iova_t iova; /**< IO address of the object. */ 147 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG 148 uint64_t cookie; /**< Debug cookie. */ 149 #endif 150 }; 151 152 /** 153 * A list of object headers type 154 */ 155 RTE_STAILQ_HEAD(rte_mempool_objhdr_list, rte_mempool_objhdr); 156 157 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG 158 159 /** 160 * Mempool object trailer structure 161 * 162 * In debug mode, each object stored in mempools are suffixed by this 163 * trailer structure containing a cookie preventing memory corruptions. 164 */ 165 struct rte_mempool_objtlr { 166 uint64_t cookie; /**< Debug cookie. */ 167 }; 168 169 #endif 170 171 /** 172 * A list of memory where objects are stored 173 */ 174 RTE_STAILQ_HEAD(rte_mempool_memhdr_list, rte_mempool_memhdr); 175 176 /** 177 * Callback used to free a memory chunk 178 */ 179 typedef void (rte_mempool_memchunk_free_cb_t)(struct rte_mempool_memhdr *memhdr, 180 void *opaque); 181 182 /** 183 * Mempool objects memory header structure 184 * 185 * The memory chunks where objects are stored. Each chunk is virtually 186 * and physically contiguous. 187 */ 188 struct rte_mempool_memhdr { 189 RTE_STAILQ_ENTRY(rte_mempool_memhdr) next; /**< Next in list. */ 190 struct rte_mempool *mp; /**< The mempool owning the chunk */ 191 void *addr; /**< Virtual address of the chunk */ 192 rte_iova_t iova; /**< IO address of the chunk */ 193 size_t len; /**< length of the chunk */ 194 rte_mempool_memchunk_free_cb_t *free_cb; /**< Free callback */ 195 void *opaque; /**< Argument passed to the free callback */ 196 }; 197 198 /** 199 * Additional information about the mempool 200 * 201 * The structure is cache-line aligned to avoid ABI breakages in 202 * a number of cases when something small is added. 203 */ 204 struct rte_mempool_info { 205 /** Number of objects in the contiguous block */ 206 unsigned int contig_block_size; 207 } __rte_cache_aligned; 208 209 /** 210 * The RTE mempool structure. 211 */ 212 struct rte_mempool { 213 char name[RTE_MEMPOOL_NAMESIZE]; /**< Name of mempool. */ 214 RTE_STD_C11 215 union { 216 void *pool_data; /**< Ring or pool to store objects. */ 217 uint64_t pool_id; /**< External mempool identifier. */ 218 }; 219 void *pool_config; /**< optional args for ops alloc. */ 220 const struct rte_memzone *mz; /**< Memzone where pool is alloc'd. */ 221 unsigned int flags; /**< Flags of the mempool. */ 222 int socket_id; /**< Socket id passed at create. */ 223 uint32_t size; /**< Max size of the mempool. */ 224 uint32_t cache_size; 225 /**< Size of per-lcore default local cache. */ 226 227 uint32_t elt_size; /**< Size of an element. */ 228 uint32_t header_size; /**< Size of header (before elt). */ 229 uint32_t trailer_size; /**< Size of trailer (after elt). */ 230 231 unsigned private_data_size; /**< Size of private data. */ 232 /** 233 * Index into rte_mempool_ops_table array of mempool ops 234 * structs, which contain callback function pointers. 235 * We're using an index here rather than pointers to the callbacks 236 * to facilitate any secondary processes that may want to use 237 * this mempool. 238 */ 239 int32_t ops_index; 240 241 struct rte_mempool_cache *local_cache; /**< Per-lcore local cache */ 242 243 uint32_t populated_size; /**< Number of populated objects. */ 244 struct rte_mempool_objhdr_list elt_list; /**< List of objects in pool */ 245 uint32_t nb_mem_chunks; /**< Number of memory chunks */ 246 struct rte_mempool_memhdr_list mem_list; /**< List of memory chunks */ 247 248 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG 249 /** Per-lcore statistics. */ 250 struct rte_mempool_debug_stats stats[RTE_MAX_LCORE]; 251 #endif 252 } __rte_cache_aligned; 253 254 /** Spreading among memory channels not required. */ 255 #define RTE_MEMPOOL_F_NO_SPREAD 0x0001 256 /** 257 * Backward compatibility synonym for RTE_MEMPOOL_F_NO_SPREAD. 258 * To be deprecated. 259 */ 260 #define MEMPOOL_F_NO_SPREAD RTE_MEMPOOL_F_NO_SPREAD 261 /** Do not align objects on cache lines. */ 262 #define RTE_MEMPOOL_F_NO_CACHE_ALIGN 0x0002 263 /** 264 * Backward compatibility synonym for RTE_MEMPOOL_F_NO_CACHE_ALIGN. 265 * To be deprecated. 266 */ 267 #define MEMPOOL_F_NO_CACHE_ALIGN RTE_MEMPOOL_F_NO_CACHE_ALIGN 268 /** Default put is "single-producer". */ 269 #define RTE_MEMPOOL_F_SP_PUT 0x0004 270 /** 271 * Backward compatibility synonym for RTE_MEMPOOL_F_SP_PUT. 272 * To be deprecated. 273 */ 274 #define MEMPOOL_F_SP_PUT RTE_MEMPOOL_F_SP_PUT 275 /** Default get is "single-consumer". */ 276 #define RTE_MEMPOOL_F_SC_GET 0x0008 277 /** 278 * Backward compatibility synonym for RTE_MEMPOOL_F_SC_GET. 279 * To be deprecated. 280 */ 281 #define MEMPOOL_F_SC_GET RTE_MEMPOOL_F_SC_GET 282 /** Internal: pool is created. */ 283 #define RTE_MEMPOOL_F_POOL_CREATED 0x0010 284 /** Don't need IOVA contiguous objects. */ 285 #define RTE_MEMPOOL_F_NO_IOVA_CONTIG 0x0020 286 /** 287 * Backward compatibility synonym for RTE_MEMPOOL_F_NO_IOVA_CONTIG. 288 * To be deprecated. 289 */ 290 #define MEMPOOL_F_NO_IOVA_CONTIG RTE_MEMPOOL_F_NO_IOVA_CONTIG 291 /** Internal: no object from the pool can be used for device IO (DMA). */ 292 #define RTE_MEMPOOL_F_NON_IO 0x0040 293 294 /** 295 * This macro lists all the mempool flags an application may request. 296 */ 297 #define RTE_MEMPOOL_VALID_USER_FLAGS (RTE_MEMPOOL_F_NO_SPREAD \ 298 | RTE_MEMPOOL_F_NO_CACHE_ALIGN \ 299 | RTE_MEMPOOL_F_SP_PUT \ 300 | RTE_MEMPOOL_F_SC_GET \ 301 | RTE_MEMPOOL_F_NO_IOVA_CONTIG \ 302 ) 303 /** 304 * @internal When debug is enabled, store some statistics. 305 * 306 * @param mp 307 * Pointer to the memory pool. 308 * @param name 309 * Name of the statistics field to increment in the memory pool. 310 * @param n 311 * Number to add to the object-oriented statistics. 312 */ 313 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG 314 #define RTE_MEMPOOL_STAT_ADD(mp, name, n) do { \ 315 unsigned __lcore_id = rte_lcore_id(); \ 316 if (__lcore_id < RTE_MAX_LCORE) { \ 317 mp->stats[__lcore_id].name += n; \ 318 } \ 319 } while (0) 320 #else 321 #define RTE_MEMPOOL_STAT_ADD(mp, name, n) do {} while (0) 322 #endif 323 324 /** 325 * @internal Calculate the size of the mempool header. 326 * 327 * @param mp 328 * Pointer to the memory pool. 329 * @param cs 330 * Size of the per-lcore cache. 331 */ 332 #define RTE_MEMPOOL_HEADER_SIZE(mp, cs) \ 333 (sizeof(*(mp)) + (((cs) == 0) ? 0 : \ 334 (sizeof(struct rte_mempool_cache) * RTE_MAX_LCORE))) 335 336 /** Deprecated. Use RTE_MEMPOOL_HEADER_SIZE() for internal purposes only. */ 337 #define MEMPOOL_HEADER_SIZE(mp, cs) \ 338 RTE_DEPRECATED(MEMPOOL_HEADER_SIZE) RTE_MEMPOOL_HEADER_SIZE(mp, cs) 339 340 /* return the header of a mempool object (internal) */ 341 static inline struct rte_mempool_objhdr * 342 rte_mempool_get_header(void *obj) 343 { 344 return (struct rte_mempool_objhdr *)RTE_PTR_SUB(obj, 345 sizeof(struct rte_mempool_objhdr)); 346 } 347 348 /** 349 * Return a pointer to the mempool owning this object. 350 * 351 * @param obj 352 * An object that is owned by a pool. If this is not the case, 353 * the behavior is undefined. 354 * @return 355 * A pointer to the mempool structure. 356 */ 357 static inline struct rte_mempool *rte_mempool_from_obj(void *obj) 358 { 359 struct rte_mempool_objhdr *hdr = rte_mempool_get_header(obj); 360 return hdr->mp; 361 } 362 363 /* return the trailer of a mempool object (internal) */ 364 static inline struct rte_mempool_objtlr *rte_mempool_get_trailer(void *obj) 365 { 366 struct rte_mempool *mp = rte_mempool_from_obj(obj); 367 return (struct rte_mempool_objtlr *)RTE_PTR_ADD(obj, mp->elt_size); 368 } 369 370 /** 371 * @internal Check and update cookies or panic. 372 * 373 * @param mp 374 * Pointer to the memory pool. 375 * @param obj_table_const 376 * Pointer to a table of void * pointers (objects). 377 * @param n 378 * Index of object in object table. 379 * @param free 380 * - 0: object is supposed to be allocated, mark it as free 381 * - 1: object is supposed to be free, mark it as allocated 382 * - 2: just check that cookie is valid (free or allocated) 383 */ 384 void rte_mempool_check_cookies(const struct rte_mempool *mp, 385 void * const *obj_table_const, unsigned n, int free); 386 387 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG 388 #define RTE_MEMPOOL_CHECK_COOKIES(mp, obj_table_const, n, free) \ 389 rte_mempool_check_cookies(mp, obj_table_const, n, free) 390 #else 391 #define RTE_MEMPOOL_CHECK_COOKIES(mp, obj_table_const, n, free) do {} while (0) 392 #endif /* RTE_LIBRTE_MEMPOOL_DEBUG */ 393 394 /** 395 * @internal Check contiguous object blocks and update cookies or panic. 396 * 397 * @param mp 398 * Pointer to the memory pool. 399 * @param first_obj_table_const 400 * Pointer to a table of void * pointers (first object of the contiguous 401 * object blocks). 402 * @param n 403 * Number of contiguous object blocks. 404 * @param free 405 * - 0: object is supposed to be allocated, mark it as free 406 * - 1: object is supposed to be free, mark it as allocated 407 * - 2: just check that cookie is valid (free or allocated) 408 */ 409 void rte_mempool_contig_blocks_check_cookies(const struct rte_mempool *mp, 410 void * const *first_obj_table_const, unsigned int n, int free); 411 412 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG 413 #define RTE_MEMPOOL_CONTIG_BLOCKS_CHECK_COOKIES(mp, first_obj_table_const, n, \ 414 free) \ 415 rte_mempool_contig_blocks_check_cookies(mp, first_obj_table_const, n, \ 416 free) 417 #else 418 #define RTE_MEMPOOL_CONTIG_BLOCKS_CHECK_COOKIES(mp, first_obj_table_const, n, \ 419 free) \ 420 do {} while (0) 421 #endif /* RTE_LIBRTE_MEMPOOL_DEBUG */ 422 423 #define RTE_MEMPOOL_OPS_NAMESIZE 32 /**< Max length of ops struct name. */ 424 425 /** 426 * Prototype for implementation specific data provisioning function. 427 * 428 * The function should provide the implementation specific memory for 429 * use by the other mempool ops functions in a given mempool ops struct. 430 * E.g. the default ops provides an instance of the rte_ring for this purpose. 431 * it will most likely point to a different type of data structure, and 432 * will be transparent to the application programmer. 433 * This function should set mp->pool_data. 434 */ 435 typedef int (*rte_mempool_alloc_t)(struct rte_mempool *mp); 436 437 /** 438 * Free the opaque private data pointed to by mp->pool_data pointer. 439 */ 440 typedef void (*rte_mempool_free_t)(struct rte_mempool *mp); 441 442 /** 443 * Enqueue an object into the external pool. 444 */ 445 typedef int (*rte_mempool_enqueue_t)(struct rte_mempool *mp, 446 void * const *obj_table, unsigned int n); 447 448 /** 449 * Dequeue an object from the external pool. 450 */ 451 typedef int (*rte_mempool_dequeue_t)(struct rte_mempool *mp, 452 void **obj_table, unsigned int n); 453 454 /** 455 * Dequeue a number of contiguous object blocks from the external pool. 456 */ 457 typedef int (*rte_mempool_dequeue_contig_blocks_t)(struct rte_mempool *mp, 458 void **first_obj_table, unsigned int n); 459 460 /** 461 * Return the number of available objects in the external pool. 462 */ 463 typedef unsigned (*rte_mempool_get_count)(const struct rte_mempool *mp); 464 465 /** 466 * Calculate memory size required to store given number of objects. 467 * 468 * If mempool objects are not required to be IOVA-contiguous 469 * (the flag RTE_MEMPOOL_F_NO_IOVA_CONTIG is set), min_chunk_size defines 470 * virtually contiguous chunk size. Otherwise, if mempool objects must 471 * be IOVA-contiguous (the flag RTE_MEMPOOL_F_NO_IOVA_CONTIG is clear), 472 * min_chunk_size defines IOVA-contiguous chunk size. 473 * 474 * @param[in] mp 475 * Pointer to the memory pool. 476 * @param[in] obj_num 477 * Number of objects. 478 * @param[in] pg_shift 479 * LOG2 of the physical pages size. If set to 0, ignore page boundaries. 480 * @param[out] min_chunk_size 481 * Location for minimum size of the memory chunk which may be used to 482 * store memory pool objects. 483 * @param[out] align 484 * Location for required memory chunk alignment. 485 * @return 486 * Required memory size. 487 */ 488 typedef ssize_t (*rte_mempool_calc_mem_size_t)(const struct rte_mempool *mp, 489 uint32_t obj_num, uint32_t pg_shift, 490 size_t *min_chunk_size, size_t *align); 491 492 /** 493 * @internal Helper to calculate memory size required to store given 494 * number of objects. 495 * 496 * This function is internal to mempool library and mempool drivers. 497 * 498 * If page boundaries may be ignored, it is just a product of total 499 * object size including header and trailer and number of objects. 500 * Otherwise, it is a number of pages required to store given number of 501 * objects without crossing page boundary. 502 * 503 * Note that if object size is bigger than page size, then it assumes 504 * that pages are grouped in subsets of physically continuous pages big 505 * enough to store at least one object. 506 * 507 * Minimum size of memory chunk is the total element size. 508 * Required memory chunk alignment is the cache line size. 509 * 510 * @param[in] mp 511 * A pointer to the mempool structure. 512 * @param[in] obj_num 513 * Number of objects to be added in mempool. 514 * @param[in] pg_shift 515 * LOG2 of the physical pages size. If set to 0, ignore page boundaries. 516 * @param[in] chunk_reserve 517 * Amount of memory that must be reserved at the beginning of each page, 518 * or at the beginning of the memory area if pg_shift is 0. 519 * @param[out] min_chunk_size 520 * Location for minimum size of the memory chunk which may be used to 521 * store memory pool objects. 522 * @param[out] align 523 * Location for required memory chunk alignment. 524 * @return 525 * Required memory size. 526 */ 527 ssize_t rte_mempool_op_calc_mem_size_helper(const struct rte_mempool *mp, 528 uint32_t obj_num, uint32_t pg_shift, size_t chunk_reserve, 529 size_t *min_chunk_size, size_t *align); 530 531 /** 532 * Default way to calculate memory size required to store given number of 533 * objects. 534 * 535 * Equivalent to rte_mempool_op_calc_mem_size_helper(mp, obj_num, pg_shift, 536 * 0, min_chunk_size, align). 537 */ 538 ssize_t rte_mempool_op_calc_mem_size_default(const struct rte_mempool *mp, 539 uint32_t obj_num, uint32_t pg_shift, 540 size_t *min_chunk_size, size_t *align); 541 542 /** 543 * Function to be called for each populated object. 544 * 545 * @param[in] mp 546 * A pointer to the mempool structure. 547 * @param[in] opaque 548 * An opaque pointer passed to iterator. 549 * @param[in] vaddr 550 * Object virtual address. 551 * @param[in] iova 552 * Input/output virtual address of the object or RTE_BAD_IOVA. 553 */ 554 typedef void (rte_mempool_populate_obj_cb_t)(struct rte_mempool *mp, 555 void *opaque, void *vaddr, rte_iova_t iova); 556 557 /** 558 * Populate memory pool objects using provided memory chunk. 559 * 560 * Populated objects should be enqueued to the pool, e.g. using 561 * rte_mempool_ops_enqueue_bulk(). 562 * 563 * If the given IO address is unknown (iova = RTE_BAD_IOVA), 564 * the chunk doesn't need to be physically contiguous (only virtually), 565 * and allocated objects may span two pages. 566 * 567 * @param[in] mp 568 * A pointer to the mempool structure. 569 * @param[in] max_objs 570 * Maximum number of objects to be populated. 571 * @param[in] vaddr 572 * The virtual address of memory that should be used to store objects. 573 * @param[in] iova 574 * The IO address 575 * @param[in] len 576 * The length of memory in bytes. 577 * @param[in] obj_cb 578 * Callback function to be executed for each populated object. 579 * @param[in] obj_cb_arg 580 * An opaque pointer passed to the callback function. 581 * @return 582 * The number of objects added on success. 583 * On error, no objects are populated and a negative errno is returned. 584 */ 585 typedef int (*rte_mempool_populate_t)(struct rte_mempool *mp, 586 unsigned int max_objs, 587 void *vaddr, rte_iova_t iova, size_t len, 588 rte_mempool_populate_obj_cb_t *obj_cb, void *obj_cb_arg); 589 590 /** 591 * Align objects on addresses multiple of total_elt_sz. 592 */ 593 #define RTE_MEMPOOL_POPULATE_F_ALIGN_OBJ 0x0001 594 595 /** 596 * @internal Helper to populate memory pool object using provided memory 597 * chunk: just slice objects one by one, taking care of not 598 * crossing page boundaries. 599 * 600 * If RTE_MEMPOOL_POPULATE_F_ALIGN_OBJ is set in flags, the addresses 601 * of object headers will be aligned on a multiple of total_elt_sz. 602 * This feature is used by octeontx hardware. 603 * 604 * This function is internal to mempool library and mempool drivers. 605 * 606 * @param[in] mp 607 * A pointer to the mempool structure. 608 * @param[in] flags 609 * Logical OR of following flags: 610 * - RTE_MEMPOOL_POPULATE_F_ALIGN_OBJ: align objects on addresses 611 * multiple of total_elt_sz. 612 * @param[in] max_objs 613 * Maximum number of objects to be added in mempool. 614 * @param[in] vaddr 615 * The virtual address of memory that should be used to store objects. 616 * @param[in] iova 617 * The IO address corresponding to vaddr, or RTE_BAD_IOVA. 618 * @param[in] len 619 * The length of memory in bytes. 620 * @param[in] obj_cb 621 * Callback function to be executed for each populated object. 622 * @param[in] obj_cb_arg 623 * An opaque pointer passed to the callback function. 624 * @return 625 * The number of objects added in mempool. 626 */ 627 int rte_mempool_op_populate_helper(struct rte_mempool *mp, 628 unsigned int flags, unsigned int max_objs, 629 void *vaddr, rte_iova_t iova, size_t len, 630 rte_mempool_populate_obj_cb_t *obj_cb, void *obj_cb_arg); 631 632 /** 633 * Default way to populate memory pool object using provided memory chunk. 634 * 635 * Equivalent to rte_mempool_op_populate_helper(mp, 0, max_objs, vaddr, iova, 636 * len, obj_cb, obj_cb_arg). 637 */ 638 int rte_mempool_op_populate_default(struct rte_mempool *mp, 639 unsigned int max_objs, 640 void *vaddr, rte_iova_t iova, size_t len, 641 rte_mempool_populate_obj_cb_t *obj_cb, void *obj_cb_arg); 642 643 /** 644 * Get some additional information about a mempool. 645 */ 646 typedef int (*rte_mempool_get_info_t)(const struct rte_mempool *mp, 647 struct rte_mempool_info *info); 648 649 650 /** Structure defining mempool operations structure */ 651 struct rte_mempool_ops { 652 char name[RTE_MEMPOOL_OPS_NAMESIZE]; /**< Name of mempool ops struct. */ 653 rte_mempool_alloc_t alloc; /**< Allocate private data. */ 654 rte_mempool_free_t free; /**< Free the external pool. */ 655 rte_mempool_enqueue_t enqueue; /**< Enqueue an object. */ 656 rte_mempool_dequeue_t dequeue; /**< Dequeue an object. */ 657 rte_mempool_get_count get_count; /**< Get qty of available objs. */ 658 /** 659 * Optional callback to calculate memory size required to 660 * store specified number of objects. 661 */ 662 rte_mempool_calc_mem_size_t calc_mem_size; 663 /** 664 * Optional callback to populate mempool objects using 665 * provided memory chunk. 666 */ 667 rte_mempool_populate_t populate; 668 /** 669 * Get mempool info 670 */ 671 rte_mempool_get_info_t get_info; 672 /** 673 * Dequeue a number of contiguous object blocks. 674 */ 675 rte_mempool_dequeue_contig_blocks_t dequeue_contig_blocks; 676 } __rte_cache_aligned; 677 678 #define RTE_MEMPOOL_MAX_OPS_IDX 16 /**< Max registered ops structs */ 679 680 /** 681 * Structure storing the table of registered ops structs, each of which contain 682 * the function pointers for the mempool ops functions. 683 * Each process has its own storage for this ops struct array so that 684 * the mempools can be shared across primary and secondary processes. 685 * The indices used to access the array are valid across processes, whereas 686 * any function pointers stored directly in the mempool struct would not be. 687 * This results in us simply having "ops_index" in the mempool struct. 688 */ 689 struct rte_mempool_ops_table { 690 rte_spinlock_t sl; /**< Spinlock for add/delete. */ 691 uint32_t num_ops; /**< Number of used ops structs in the table. */ 692 /** 693 * Storage for all possible ops structs. 694 */ 695 struct rte_mempool_ops ops[RTE_MEMPOOL_MAX_OPS_IDX]; 696 } __rte_cache_aligned; 697 698 /** Array of registered ops structs. */ 699 extern struct rte_mempool_ops_table rte_mempool_ops_table; 700 701 /** 702 * @internal Get the mempool ops struct from its index. 703 * 704 * @param ops_index 705 * The index of the ops struct in the ops struct table. It must be a valid 706 * index: (0 <= idx < num_ops). 707 * @return 708 * The pointer to the ops struct in the table. 709 */ 710 static inline struct rte_mempool_ops * 711 rte_mempool_get_ops(int ops_index) 712 { 713 RTE_VERIFY((ops_index >= 0) && (ops_index < RTE_MEMPOOL_MAX_OPS_IDX)); 714 715 return &rte_mempool_ops_table.ops[ops_index]; 716 } 717 718 /** 719 * @internal Wrapper for mempool_ops alloc callback. 720 * 721 * @param mp 722 * Pointer to the memory pool. 723 * @return 724 * - 0: Success; successfully allocated mempool pool_data. 725 * - <0: Error; code of alloc function. 726 */ 727 int 728 rte_mempool_ops_alloc(struct rte_mempool *mp); 729 730 /** 731 * @internal Wrapper for mempool_ops dequeue callback. 732 * 733 * @param mp 734 * Pointer to the memory pool. 735 * @param obj_table 736 * Pointer to a table of void * pointers (objects). 737 * @param n 738 * Number of objects to get. 739 * @return 740 * - 0: Success; got n objects. 741 * - <0: Error; code of dequeue function. 742 */ 743 static inline int 744 rte_mempool_ops_dequeue_bulk(struct rte_mempool *mp, 745 void **obj_table, unsigned n) 746 { 747 struct rte_mempool_ops *ops; 748 int ret; 749 750 rte_mempool_trace_ops_dequeue_bulk(mp, obj_table, n); 751 ops = rte_mempool_get_ops(mp->ops_index); 752 ret = ops->dequeue(mp, obj_table, n); 753 if (ret == 0) { 754 RTE_MEMPOOL_STAT_ADD(mp, get_common_pool_bulk, 1); 755 RTE_MEMPOOL_STAT_ADD(mp, get_common_pool_objs, n); 756 } 757 return ret; 758 } 759 760 /** 761 * @internal Wrapper for mempool_ops dequeue_contig_blocks callback. 762 * 763 * @param[in] mp 764 * Pointer to the memory pool. 765 * @param[out] first_obj_table 766 * Pointer to a table of void * pointers (first objects). 767 * @param[in] n 768 * Number of blocks to get. 769 * @return 770 * - 0: Success; got n objects. 771 * - <0: Error; code of dequeue function. 772 */ 773 static inline int 774 rte_mempool_ops_dequeue_contig_blocks(struct rte_mempool *mp, 775 void **first_obj_table, unsigned int n) 776 { 777 struct rte_mempool_ops *ops; 778 779 ops = rte_mempool_get_ops(mp->ops_index); 780 RTE_ASSERT(ops->dequeue_contig_blocks != NULL); 781 rte_mempool_trace_ops_dequeue_contig_blocks(mp, first_obj_table, n); 782 return ops->dequeue_contig_blocks(mp, first_obj_table, n); 783 } 784 785 /** 786 * @internal wrapper for mempool_ops enqueue callback. 787 * 788 * @param mp 789 * Pointer to the memory pool. 790 * @param obj_table 791 * Pointer to a table of void * pointers (objects). 792 * @param n 793 * Number of objects to put. 794 * @return 795 * - 0: Success; n objects supplied. 796 * - <0: Error; code of enqueue function. 797 */ 798 static inline int 799 rte_mempool_ops_enqueue_bulk(struct rte_mempool *mp, void * const *obj_table, 800 unsigned n) 801 { 802 struct rte_mempool_ops *ops; 803 804 RTE_MEMPOOL_STAT_ADD(mp, put_common_pool_bulk, 1); 805 RTE_MEMPOOL_STAT_ADD(mp, put_common_pool_objs, n); 806 rte_mempool_trace_ops_enqueue_bulk(mp, obj_table, n); 807 ops = rte_mempool_get_ops(mp->ops_index); 808 return ops->enqueue(mp, obj_table, n); 809 } 810 811 /** 812 * @internal wrapper for mempool_ops get_count callback. 813 * 814 * @param mp 815 * Pointer to the memory pool. 816 * @return 817 * The number of available objects in the external pool. 818 */ 819 unsigned 820 rte_mempool_ops_get_count(const struct rte_mempool *mp); 821 822 /** 823 * @internal wrapper for mempool_ops calc_mem_size callback. 824 * API to calculate size of memory required to store specified number of 825 * object. 826 * 827 * @param[in] mp 828 * Pointer to the memory pool. 829 * @param[in] obj_num 830 * Number of objects. 831 * @param[in] pg_shift 832 * LOG2 of the physical pages size. If set to 0, ignore page boundaries. 833 * @param[out] min_chunk_size 834 * Location for minimum size of the memory chunk which may be used to 835 * store memory pool objects. 836 * @param[out] align 837 * Location for required memory chunk alignment. 838 * @return 839 * Required memory size aligned at page boundary. 840 */ 841 ssize_t rte_mempool_ops_calc_mem_size(const struct rte_mempool *mp, 842 uint32_t obj_num, uint32_t pg_shift, 843 size_t *min_chunk_size, size_t *align); 844 845 /** 846 * @internal wrapper for mempool_ops populate callback. 847 * 848 * Populate memory pool objects using provided memory chunk. 849 * 850 * @param[in] mp 851 * A pointer to the mempool structure. 852 * @param[in] max_objs 853 * Maximum number of objects to be populated. 854 * @param[in] vaddr 855 * The virtual address of memory that should be used to store objects. 856 * @param[in] iova 857 * The IO address 858 * @param[in] len 859 * The length of memory in bytes. 860 * @param[in] obj_cb 861 * Callback function to be executed for each populated object. 862 * @param[in] obj_cb_arg 863 * An opaque pointer passed to the callback function. 864 * @return 865 * The number of objects added on success. 866 * On error, no objects are populated and a negative errno is returned. 867 */ 868 int rte_mempool_ops_populate(struct rte_mempool *mp, unsigned int max_objs, 869 void *vaddr, rte_iova_t iova, size_t len, 870 rte_mempool_populate_obj_cb_t *obj_cb, 871 void *obj_cb_arg); 872 873 /** 874 * Wrapper for mempool_ops get_info callback. 875 * 876 * @param[in] mp 877 * Pointer to the memory pool. 878 * @param[out] info 879 * Pointer to the rte_mempool_info structure 880 * @return 881 * - 0: Success; The mempool driver supports retrieving supplementary 882 * mempool information 883 * - -ENOTSUP - doesn't support get_info ops (valid case). 884 */ 885 int rte_mempool_ops_get_info(const struct rte_mempool *mp, 886 struct rte_mempool_info *info); 887 888 /** 889 * @internal wrapper for mempool_ops free callback. 890 * 891 * @param mp 892 * Pointer to the memory pool. 893 */ 894 void 895 rte_mempool_ops_free(struct rte_mempool *mp); 896 897 /** 898 * Set the ops of a mempool. 899 * 900 * This can only be done on a mempool that is not populated, i.e. just after 901 * a call to rte_mempool_create_empty(). 902 * 903 * @param mp 904 * Pointer to the memory pool. 905 * @param name 906 * Name of the ops structure to use for this mempool. 907 * @param pool_config 908 * Opaque data that can be passed by the application to the ops functions. 909 * @return 910 * - 0: Success; the mempool is now using the requested ops functions. 911 * - -EINVAL - Invalid ops struct name provided. 912 * - -EEXIST - mempool already has an ops struct assigned. 913 */ 914 int 915 rte_mempool_set_ops_byname(struct rte_mempool *mp, const char *name, 916 void *pool_config); 917 918 /** 919 * Register mempool operations. 920 * 921 * @param ops 922 * Pointer to an ops structure to register. 923 * @return 924 * - >=0: Success; return the index of the ops struct in the table. 925 * - -EINVAL - some missing callbacks while registering ops struct. 926 * - -ENOSPC - the maximum number of ops structs has been reached. 927 */ 928 int rte_mempool_register_ops(const struct rte_mempool_ops *ops); 929 930 /** 931 * Macro to statically register the ops of a mempool handler. 932 * Note that the rte_mempool_register_ops fails silently here when 933 * more than RTE_MEMPOOL_MAX_OPS_IDX is registered. 934 */ 935 #define RTE_MEMPOOL_REGISTER_OPS(ops) \ 936 RTE_INIT(mp_hdlr_init_##ops) \ 937 { \ 938 rte_mempool_register_ops(&ops); \ 939 } 940 941 /** Deprecated. Use RTE_MEMPOOL_REGISTER_OPS() instead. */ 942 #define MEMPOOL_REGISTER_OPS(ops) \ 943 RTE_DEPRECATED(MEMPOOL_REGISTER_OPS) RTE_MEMPOOL_REGISTER_OPS(ops) 944 945 /** 946 * An object callback function for mempool. 947 * 948 * Used by rte_mempool_create() and rte_mempool_obj_iter(). 949 */ 950 typedef void (rte_mempool_obj_cb_t)(struct rte_mempool *mp, 951 void *opaque, void *obj, unsigned obj_idx); 952 typedef rte_mempool_obj_cb_t rte_mempool_obj_ctor_t; /* compat */ 953 954 /** 955 * A memory callback function for mempool. 956 * 957 * Used by rte_mempool_mem_iter(). 958 */ 959 typedef void (rte_mempool_mem_cb_t)(struct rte_mempool *mp, 960 void *opaque, struct rte_mempool_memhdr *memhdr, 961 unsigned mem_idx); 962 963 /** 964 * A mempool constructor callback function. 965 * 966 * Arguments are the mempool and the opaque pointer given by the user in 967 * rte_mempool_create(). 968 */ 969 typedef void (rte_mempool_ctor_t)(struct rte_mempool *, void *); 970 971 /** 972 * Create a new mempool named *name* in memory. 973 * 974 * This function uses ``rte_memzone_reserve()`` to allocate memory. The 975 * pool contains n elements of elt_size. Its size is set to n. 976 * 977 * @param name 978 * The name of the mempool. 979 * @param n 980 * The number of elements in the mempool. The optimum size (in terms of 981 * memory usage) for a mempool is when n is a power of two minus one: 982 * n = (2^q - 1). 983 * @param elt_size 984 * The size of each element. 985 * @param cache_size 986 * If cache_size is non-zero, the rte_mempool library will try to 987 * limit the accesses to the common lockless pool, by maintaining a 988 * per-lcore object cache. This argument must be lower or equal to 989 * RTE_MEMPOOL_CACHE_MAX_SIZE and n / 1.5. It is advised to choose 990 * cache_size to have "n modulo cache_size == 0": if this is 991 * not the case, some elements will always stay in the pool and will 992 * never be used. The access to the per-lcore table is of course 993 * faster than the multi-producer/consumer pool. The cache can be 994 * disabled if the cache_size argument is set to 0; it can be useful to 995 * avoid losing objects in cache. 996 * @param private_data_size 997 * The size of the private data appended after the mempool 998 * structure. This is useful for storing some private data after the 999 * mempool structure, as is done for rte_mbuf_pool for example. 1000 * @param mp_init 1001 * A function pointer that is called for initialization of the pool, 1002 * before object initialization. The user can initialize the private 1003 * data in this function if needed. This parameter can be NULL if 1004 * not needed. 1005 * @param mp_init_arg 1006 * An opaque pointer to data that can be used in the mempool 1007 * constructor function. 1008 * @param obj_init 1009 * A function pointer that is called for each object at 1010 * initialization of the pool. The user can set some meta data in 1011 * objects if needed. This parameter can be NULL if not needed. 1012 * The obj_init() function takes the mempool pointer, the init_arg, 1013 * the object pointer and the object number as parameters. 1014 * @param obj_init_arg 1015 * An opaque pointer to data that can be used as an argument for 1016 * each call to the object constructor function. 1017 * @param socket_id 1018 * The *socket_id* argument is the socket identifier in the case of 1019 * NUMA. The value can be *SOCKET_ID_ANY* if there is no NUMA 1020 * constraint for the reserved zone. 1021 * @param flags 1022 * The *flags* arguments is an OR of following flags: 1023 * - RTE_MEMPOOL_F_NO_SPREAD: By default, objects addresses are spread 1024 * between channels in RAM: the pool allocator will add padding 1025 * between objects depending on the hardware configuration. See 1026 * Memory alignment constraints for details. If this flag is set, 1027 * the allocator will just align them to a cache line. 1028 * - RTE_MEMPOOL_F_NO_CACHE_ALIGN: By default, the returned objects are 1029 * cache-aligned. This flag removes this constraint, and no 1030 * padding will be present between objects. This flag implies 1031 * RTE_MEMPOOL_F_NO_SPREAD. 1032 * - RTE_MEMPOOL_F_SP_PUT: If this flag is set, the default behavior 1033 * when using rte_mempool_put() or rte_mempool_put_bulk() is 1034 * "single-producer". Otherwise, it is "multi-producers". 1035 * - RTE_MEMPOOL_F_SC_GET: If this flag is set, the default behavior 1036 * when using rte_mempool_get() or rte_mempool_get_bulk() is 1037 * "single-consumer". Otherwise, it is "multi-consumers". 1038 * - RTE_MEMPOOL_F_NO_IOVA_CONTIG: If set, allocated objects won't 1039 * necessarily be contiguous in IO memory. 1040 * @return 1041 * The pointer to the new allocated mempool, on success. NULL on error 1042 * with rte_errno set appropriately. Possible rte_errno values include: 1043 * - E_RTE_NO_CONFIG - function could not get pointer to rte_config structure 1044 * - E_RTE_SECONDARY - function was called from a secondary process instance 1045 * - EINVAL - cache size provided is too large or an unknown flag was passed 1046 * - ENOSPC - the maximum number of memzones has already been allocated 1047 * - EEXIST - a memzone with the same name already exists 1048 * - ENOMEM - no appropriate memory area found in which to create memzone 1049 */ 1050 struct rte_mempool * 1051 rte_mempool_create(const char *name, unsigned n, unsigned elt_size, 1052 unsigned cache_size, unsigned private_data_size, 1053 rte_mempool_ctor_t *mp_init, void *mp_init_arg, 1054 rte_mempool_obj_cb_t *obj_init, void *obj_init_arg, 1055 int socket_id, unsigned flags); 1056 1057 /** 1058 * Create an empty mempool 1059 * 1060 * The mempool is allocated and initialized, but it is not populated: no 1061 * memory is allocated for the mempool elements. The user has to call 1062 * rte_mempool_populate_*() to add memory chunks to the pool. Once 1063 * populated, the user may also want to initialize each object with 1064 * rte_mempool_obj_iter(). 1065 * 1066 * @param name 1067 * The name of the mempool. 1068 * @param n 1069 * The maximum number of elements that can be added in the mempool. 1070 * The optimum size (in terms of memory usage) for a mempool is when n 1071 * is a power of two minus one: n = (2^q - 1). 1072 * @param elt_size 1073 * The size of each element. 1074 * @param cache_size 1075 * Size of the cache. See rte_mempool_create() for details. 1076 * @param private_data_size 1077 * The size of the private data appended after the mempool 1078 * structure. This is useful for storing some private data after the 1079 * mempool structure, as is done for rte_mbuf_pool for example. 1080 * @param socket_id 1081 * The *socket_id* argument is the socket identifier in the case of 1082 * NUMA. The value can be *SOCKET_ID_ANY* if there is no NUMA 1083 * constraint for the reserved zone. 1084 * @param flags 1085 * Flags controlling the behavior of the mempool. See 1086 * rte_mempool_create() for details. 1087 * @return 1088 * The pointer to the new allocated mempool, on success. NULL on error 1089 * with rte_errno set appropriately. See rte_mempool_create() for details. 1090 */ 1091 struct rte_mempool * 1092 rte_mempool_create_empty(const char *name, unsigned n, unsigned elt_size, 1093 unsigned cache_size, unsigned private_data_size, 1094 int socket_id, unsigned flags); 1095 /** 1096 * Free a mempool 1097 * 1098 * Unlink the mempool from global list, free the memory chunks, and all 1099 * memory referenced by the mempool. The objects must not be used by 1100 * other cores as they will be freed. 1101 * 1102 * @param mp 1103 * A pointer to the mempool structure. 1104 */ 1105 void 1106 rte_mempool_free(struct rte_mempool *mp); 1107 1108 /** 1109 * Add physically contiguous memory for objects in the pool at init 1110 * 1111 * Add a virtually and physically contiguous memory chunk in the pool 1112 * where objects can be instantiated. 1113 * 1114 * If the given IO address is unknown (iova = RTE_BAD_IOVA), 1115 * the chunk doesn't need to be physically contiguous (only virtually), 1116 * and allocated objects may span two pages. 1117 * 1118 * @param mp 1119 * A pointer to the mempool structure. 1120 * @param vaddr 1121 * The virtual address of memory that should be used to store objects. 1122 * @param iova 1123 * The IO address 1124 * @param len 1125 * The length of memory in bytes. 1126 * @param free_cb 1127 * The callback used to free this chunk when destroying the mempool. 1128 * @param opaque 1129 * An opaque argument passed to free_cb. 1130 * @return 1131 * The number of objects added on success (strictly positive). 1132 * On error, the chunk is not added in the memory list of the 1133 * mempool the following code is returned: 1134 * (0): not enough room in chunk for one object. 1135 * (-ENOSPC): mempool is already populated. 1136 * (-ENOMEM): allocation failure. 1137 */ 1138 int rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, 1139 rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free_cb, 1140 void *opaque); 1141 1142 /** 1143 * Add virtually contiguous memory for objects in the pool at init 1144 * 1145 * Add a virtually contiguous memory chunk in the pool where objects can 1146 * be instantiated. 1147 * 1148 * @param mp 1149 * A pointer to the mempool structure. 1150 * @param addr 1151 * The virtual address of memory that should be used to store objects. 1152 * @param len 1153 * The length of memory in bytes. 1154 * @param pg_sz 1155 * The size of memory pages in this virtual area. 1156 * @param free_cb 1157 * The callback used to free this chunk when destroying the mempool. 1158 * @param opaque 1159 * An opaque argument passed to free_cb. 1160 * @return 1161 * The number of objects added on success (strictly positive). 1162 * On error, the chunk is not added in the memory list of the 1163 * mempool the following code is returned: 1164 * (0): not enough room in chunk for one object. 1165 * (-ENOSPC): mempool is already populated. 1166 * (-ENOMEM): allocation failure. 1167 */ 1168 int 1169 rte_mempool_populate_virt(struct rte_mempool *mp, char *addr, 1170 size_t len, size_t pg_sz, rte_mempool_memchunk_free_cb_t *free_cb, 1171 void *opaque); 1172 1173 /** 1174 * Add memory for objects in the pool at init 1175 * 1176 * This is the default function used by rte_mempool_create() to populate 1177 * the mempool. It adds memory allocated using rte_memzone_reserve(). 1178 * 1179 * @param mp 1180 * A pointer to the mempool structure. 1181 * @return 1182 * The number of objects added on success. 1183 * On error, the chunk is not added in the memory list of the 1184 * mempool and a negative errno is returned. 1185 */ 1186 int rte_mempool_populate_default(struct rte_mempool *mp); 1187 1188 /** 1189 * Add memory from anonymous mapping for objects in the pool at init 1190 * 1191 * This function mmap an anonymous memory zone that is locked in 1192 * memory to store the objects of the mempool. 1193 * 1194 * @param mp 1195 * A pointer to the mempool structure. 1196 * @return 1197 * The number of objects added on success. 1198 * On error, 0 is returned, rte_errno is set, and the chunk is not added in 1199 * the memory list of the mempool. 1200 */ 1201 int rte_mempool_populate_anon(struct rte_mempool *mp); 1202 1203 /** 1204 * Call a function for each mempool element 1205 * 1206 * Iterate across all objects attached to a rte_mempool and call the 1207 * callback function on it. 1208 * 1209 * @param mp 1210 * A pointer to an initialized mempool. 1211 * @param obj_cb 1212 * A function pointer that is called for each object. 1213 * @param obj_cb_arg 1214 * An opaque pointer passed to the callback function. 1215 * @return 1216 * Number of objects iterated. 1217 */ 1218 uint32_t rte_mempool_obj_iter(struct rte_mempool *mp, 1219 rte_mempool_obj_cb_t *obj_cb, void *obj_cb_arg); 1220 1221 /** 1222 * Call a function for each mempool memory chunk 1223 * 1224 * Iterate across all memory chunks attached to a rte_mempool and call 1225 * the callback function on it. 1226 * 1227 * @param mp 1228 * A pointer to an initialized mempool. 1229 * @param mem_cb 1230 * A function pointer that is called for each memory chunk. 1231 * @param mem_cb_arg 1232 * An opaque pointer passed to the callback function. 1233 * @return 1234 * Number of memory chunks iterated. 1235 */ 1236 uint32_t rte_mempool_mem_iter(struct rte_mempool *mp, 1237 rte_mempool_mem_cb_t *mem_cb, void *mem_cb_arg); 1238 1239 /** 1240 * Dump the status of the mempool to a file. 1241 * 1242 * @param f 1243 * A pointer to a file for output 1244 * @param mp 1245 * A pointer to the mempool structure. 1246 */ 1247 void rte_mempool_dump(FILE *f, struct rte_mempool *mp); 1248 1249 /** 1250 * Create a user-owned mempool cache. 1251 * 1252 * This can be used by unregistered non-EAL threads to enable caching when they 1253 * interact with a mempool. 1254 * 1255 * @param size 1256 * The size of the mempool cache. See rte_mempool_create()'s cache_size 1257 * parameter description for more information. The same limits and 1258 * considerations apply here too. 1259 * @param socket_id 1260 * The socket identifier in the case of NUMA. The value can be 1261 * SOCKET_ID_ANY if there is no NUMA constraint for the reserved zone. 1262 */ 1263 struct rte_mempool_cache * 1264 rte_mempool_cache_create(uint32_t size, int socket_id); 1265 1266 /** 1267 * Free a user-owned mempool cache. 1268 * 1269 * @param cache 1270 * A pointer to the mempool cache. 1271 */ 1272 void 1273 rte_mempool_cache_free(struct rte_mempool_cache *cache); 1274 1275 /** 1276 * Get a pointer to the per-lcore default mempool cache. 1277 * 1278 * @param mp 1279 * A pointer to the mempool structure. 1280 * @param lcore_id 1281 * The logical core id. 1282 * @return 1283 * A pointer to the mempool cache or NULL if disabled or unregistered non-EAL 1284 * thread. 1285 */ 1286 static __rte_always_inline struct rte_mempool_cache * 1287 rte_mempool_default_cache(struct rte_mempool *mp, unsigned lcore_id) 1288 { 1289 if (mp->cache_size == 0) 1290 return NULL; 1291 1292 if (lcore_id >= RTE_MAX_LCORE) 1293 return NULL; 1294 1295 rte_mempool_trace_default_cache(mp, lcore_id, 1296 &mp->local_cache[lcore_id]); 1297 return &mp->local_cache[lcore_id]; 1298 } 1299 1300 /** 1301 * Flush a user-owned mempool cache to the specified mempool. 1302 * 1303 * @param cache 1304 * A pointer to the mempool cache. 1305 * @param mp 1306 * A pointer to the mempool. 1307 */ 1308 static __rte_always_inline void 1309 rte_mempool_cache_flush(struct rte_mempool_cache *cache, 1310 struct rte_mempool *mp) 1311 { 1312 if (cache == NULL) 1313 cache = rte_mempool_default_cache(mp, rte_lcore_id()); 1314 if (cache == NULL || cache->len == 0) 1315 return; 1316 rte_mempool_trace_cache_flush(cache, mp); 1317 rte_mempool_ops_enqueue_bulk(mp, cache->objs, cache->len); 1318 cache->len = 0; 1319 } 1320 1321 /** 1322 * @internal Put several objects back in the mempool; used internally. 1323 * @param mp 1324 * A pointer to the mempool structure. 1325 * @param obj_table 1326 * A pointer to a table of void * pointers (objects). 1327 * @param n 1328 * The number of objects to store back in the mempool, must be strictly 1329 * positive. 1330 * @param cache 1331 * A pointer to a mempool cache structure. May be NULL if not needed. 1332 */ 1333 static __rte_always_inline void 1334 rte_mempool_do_generic_put(struct rte_mempool *mp, void * const *obj_table, 1335 unsigned int n, struct rte_mempool_cache *cache) 1336 { 1337 void **cache_objs; 1338 1339 /* increment stat now, adding in mempool always success */ 1340 RTE_MEMPOOL_STAT_ADD(mp, put_bulk, 1); 1341 RTE_MEMPOOL_STAT_ADD(mp, put_objs, n); 1342 1343 /* No cache provided or if put would overflow mem allocated for cache */ 1344 if (unlikely(cache == NULL || n > RTE_MEMPOOL_CACHE_MAX_SIZE)) 1345 goto ring_enqueue; 1346 1347 cache_objs = &cache->objs[cache->len]; 1348 1349 /* 1350 * The cache follows the following algorithm 1351 * 1. Add the objects to the cache 1352 * 2. Anything greater than the cache min value (if it crosses the 1353 * cache flush threshold) is flushed to the ring. 1354 */ 1355 1356 /* Add elements back into the cache */ 1357 rte_memcpy(&cache_objs[0], obj_table, sizeof(void *) * n); 1358 1359 cache->len += n; 1360 1361 if (cache->len >= cache->flushthresh) { 1362 rte_mempool_ops_enqueue_bulk(mp, &cache->objs[cache->size], 1363 cache->len - cache->size); 1364 cache->len = cache->size; 1365 } 1366 1367 return; 1368 1369 ring_enqueue: 1370 1371 /* push remaining objects in ring */ 1372 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG 1373 if (rte_mempool_ops_enqueue_bulk(mp, obj_table, n) < 0) 1374 rte_panic("cannot put objects in mempool\n"); 1375 #else 1376 rte_mempool_ops_enqueue_bulk(mp, obj_table, n); 1377 #endif 1378 } 1379 1380 1381 /** 1382 * Put several objects back in the mempool. 1383 * 1384 * @param mp 1385 * A pointer to the mempool structure. 1386 * @param obj_table 1387 * A pointer to a table of void * pointers (objects). 1388 * @param n 1389 * The number of objects to add in the mempool from the obj_table. 1390 * @param cache 1391 * A pointer to a mempool cache structure. May be NULL if not needed. 1392 */ 1393 static __rte_always_inline void 1394 rte_mempool_generic_put(struct rte_mempool *mp, void * const *obj_table, 1395 unsigned int n, struct rte_mempool_cache *cache) 1396 { 1397 rte_mempool_trace_generic_put(mp, obj_table, n, cache); 1398 RTE_MEMPOOL_CHECK_COOKIES(mp, obj_table, n, 0); 1399 rte_mempool_do_generic_put(mp, obj_table, n, cache); 1400 } 1401 1402 /** 1403 * Put several objects back in the mempool. 1404 * 1405 * This function calls the multi-producer or the single-producer 1406 * version depending on the default behavior that was specified at 1407 * mempool creation time (see flags). 1408 * 1409 * @param mp 1410 * A pointer to the mempool structure. 1411 * @param obj_table 1412 * A pointer to a table of void * pointers (objects). 1413 * @param n 1414 * The number of objects to add in the mempool from obj_table. 1415 */ 1416 static __rte_always_inline void 1417 rte_mempool_put_bulk(struct rte_mempool *mp, void * const *obj_table, 1418 unsigned int n) 1419 { 1420 struct rte_mempool_cache *cache; 1421 cache = rte_mempool_default_cache(mp, rte_lcore_id()); 1422 rte_mempool_trace_put_bulk(mp, obj_table, n, cache); 1423 rte_mempool_generic_put(mp, obj_table, n, cache); 1424 } 1425 1426 /** 1427 * Put one object back in the mempool. 1428 * 1429 * This function calls the multi-producer or the single-producer 1430 * version depending on the default behavior that was specified at 1431 * mempool creation time (see flags). 1432 * 1433 * @param mp 1434 * A pointer to the mempool structure. 1435 * @param obj 1436 * A pointer to the object to be added. 1437 */ 1438 static __rte_always_inline void 1439 rte_mempool_put(struct rte_mempool *mp, void *obj) 1440 { 1441 rte_mempool_put_bulk(mp, &obj, 1); 1442 } 1443 1444 /** 1445 * @internal Get several objects from the mempool; used internally. 1446 * @param mp 1447 * A pointer to the mempool structure. 1448 * @param obj_table 1449 * A pointer to a table of void * pointers (objects). 1450 * @param n 1451 * The number of objects to get, must be strictly positive. 1452 * @param cache 1453 * A pointer to a mempool cache structure. May be NULL if not needed. 1454 * @return 1455 * - >=0: Success; number of objects supplied. 1456 * - <0: Error; code of ring dequeue function. 1457 */ 1458 static __rte_always_inline int 1459 rte_mempool_do_generic_get(struct rte_mempool *mp, void **obj_table, 1460 unsigned int n, struct rte_mempool_cache *cache) 1461 { 1462 int ret; 1463 uint32_t index, len; 1464 void **cache_objs; 1465 1466 /* No cache provided or cannot be satisfied from cache */ 1467 if (unlikely(cache == NULL || n >= cache->size)) 1468 goto ring_dequeue; 1469 1470 cache_objs = cache->objs; 1471 1472 /* Can this be satisfied from the cache? */ 1473 if (cache->len < n) { 1474 /* No. Backfill the cache first, and then fill from it */ 1475 uint32_t req = n + (cache->size - cache->len); 1476 1477 /* How many do we require i.e. number to fill the cache + the request */ 1478 ret = rte_mempool_ops_dequeue_bulk(mp, 1479 &cache->objs[cache->len], req); 1480 if (unlikely(ret < 0)) { 1481 /* 1482 * In the off chance that we are buffer constrained, 1483 * where we are not able to allocate cache + n, go to 1484 * the ring directly. If that fails, we are truly out of 1485 * buffers. 1486 */ 1487 goto ring_dequeue; 1488 } 1489 1490 cache->len += req; 1491 } 1492 1493 /* Now fill in the response ... */ 1494 for (index = 0, len = cache->len - 1; index < n; ++index, len--, obj_table++) 1495 *obj_table = cache_objs[len]; 1496 1497 cache->len -= n; 1498 1499 RTE_MEMPOOL_STAT_ADD(mp, get_success_bulk, 1); 1500 RTE_MEMPOOL_STAT_ADD(mp, get_success_objs, n); 1501 1502 return 0; 1503 1504 ring_dequeue: 1505 1506 /* get remaining objects from ring */ 1507 ret = rte_mempool_ops_dequeue_bulk(mp, obj_table, n); 1508 1509 if (ret < 0) { 1510 RTE_MEMPOOL_STAT_ADD(mp, get_fail_bulk, 1); 1511 RTE_MEMPOOL_STAT_ADD(mp, get_fail_objs, n); 1512 } else { 1513 RTE_MEMPOOL_STAT_ADD(mp, get_success_bulk, 1); 1514 RTE_MEMPOOL_STAT_ADD(mp, get_success_objs, n); 1515 } 1516 1517 return ret; 1518 } 1519 1520 /** 1521 * Get several objects from the mempool. 1522 * 1523 * If cache is enabled, objects will be retrieved first from cache, 1524 * subsequently from the common pool. Note that it can return -ENOENT when 1525 * the local cache and common pool are empty, even if cache from other 1526 * lcores are full. 1527 * 1528 * @param mp 1529 * A pointer to the mempool structure. 1530 * @param obj_table 1531 * A pointer to a table of void * pointers (objects) that will be filled. 1532 * @param n 1533 * The number of objects to get from mempool to obj_table. 1534 * @param cache 1535 * A pointer to a mempool cache structure. May be NULL if not needed. 1536 * @return 1537 * - 0: Success; objects taken. 1538 * - -ENOENT: Not enough entries in the mempool; no object is retrieved. 1539 */ 1540 static __rte_always_inline int 1541 rte_mempool_generic_get(struct rte_mempool *mp, void **obj_table, 1542 unsigned int n, struct rte_mempool_cache *cache) 1543 { 1544 int ret; 1545 ret = rte_mempool_do_generic_get(mp, obj_table, n, cache); 1546 if (ret == 0) 1547 RTE_MEMPOOL_CHECK_COOKIES(mp, obj_table, n, 1); 1548 rte_mempool_trace_generic_get(mp, obj_table, n, cache); 1549 return ret; 1550 } 1551 1552 /** 1553 * Get several objects from the mempool. 1554 * 1555 * This function calls the multi-consumers or the single-consumer 1556 * version, depending on the default behaviour that was specified at 1557 * mempool creation time (see flags). 1558 * 1559 * If cache is enabled, objects will be retrieved first from cache, 1560 * subsequently from the common pool. Note that it can return -ENOENT when 1561 * the local cache and common pool are empty, even if cache from other 1562 * lcores are full. 1563 * 1564 * @param mp 1565 * A pointer to the mempool structure. 1566 * @param obj_table 1567 * A pointer to a table of void * pointers (objects) that will be filled. 1568 * @param n 1569 * The number of objects to get from the mempool to obj_table. 1570 * @return 1571 * - 0: Success; objects taken 1572 * - -ENOENT: Not enough entries in the mempool; no object is retrieved. 1573 */ 1574 static __rte_always_inline int 1575 rte_mempool_get_bulk(struct rte_mempool *mp, void **obj_table, unsigned int n) 1576 { 1577 struct rte_mempool_cache *cache; 1578 cache = rte_mempool_default_cache(mp, rte_lcore_id()); 1579 rte_mempool_trace_get_bulk(mp, obj_table, n, cache); 1580 return rte_mempool_generic_get(mp, obj_table, n, cache); 1581 } 1582 1583 /** 1584 * Get one object from the mempool. 1585 * 1586 * This function calls the multi-consumers or the single-consumer 1587 * version, depending on the default behavior that was specified at 1588 * mempool creation (see flags). 1589 * 1590 * If cache is enabled, objects will be retrieved first from cache, 1591 * subsequently from the common pool. Note that it can return -ENOENT when 1592 * the local cache and common pool are empty, even if cache from other 1593 * lcores are full. 1594 * 1595 * @param mp 1596 * A pointer to the mempool structure. 1597 * @param obj_p 1598 * A pointer to a void * pointer (object) that will be filled. 1599 * @return 1600 * - 0: Success; objects taken. 1601 * - -ENOENT: Not enough entries in the mempool; no object is retrieved. 1602 */ 1603 static __rte_always_inline int 1604 rte_mempool_get(struct rte_mempool *mp, void **obj_p) 1605 { 1606 return rte_mempool_get_bulk(mp, obj_p, 1); 1607 } 1608 1609 /** 1610 * Get a contiguous blocks of objects from the mempool. 1611 * 1612 * If cache is enabled, consider to flush it first, to reuse objects 1613 * as soon as possible. 1614 * 1615 * The application should check that the driver supports the operation 1616 * by calling rte_mempool_ops_get_info() and checking that `contig_block_size` 1617 * is not zero. 1618 * 1619 * @param mp 1620 * A pointer to the mempool structure. 1621 * @param first_obj_table 1622 * A pointer to a pointer to the first object in each block. 1623 * @param n 1624 * The number of blocks to get from mempool. 1625 * @return 1626 * - 0: Success; blocks taken. 1627 * - -ENOBUFS: Not enough entries in the mempool; no object is retrieved. 1628 * - -EOPNOTSUPP: The mempool driver does not support block dequeue 1629 */ 1630 static __rte_always_inline int 1631 rte_mempool_get_contig_blocks(struct rte_mempool *mp, 1632 void **first_obj_table, unsigned int n) 1633 { 1634 int ret; 1635 1636 ret = rte_mempool_ops_dequeue_contig_blocks(mp, first_obj_table, n); 1637 if (ret == 0) { 1638 RTE_MEMPOOL_STAT_ADD(mp, get_success_bulk, 1); 1639 RTE_MEMPOOL_STAT_ADD(mp, get_success_blks, n); 1640 RTE_MEMPOOL_CONTIG_BLOCKS_CHECK_COOKIES(mp, first_obj_table, n, 1641 1); 1642 } else { 1643 RTE_MEMPOOL_STAT_ADD(mp, get_fail_bulk, 1); 1644 RTE_MEMPOOL_STAT_ADD(mp, get_fail_blks, n); 1645 } 1646 1647 rte_mempool_trace_get_contig_blocks(mp, first_obj_table, n); 1648 return ret; 1649 } 1650 1651 /** 1652 * Return the number of entries in the mempool. 1653 * 1654 * When cache is enabled, this function has to browse the length of 1655 * all lcores, so it should not be used in a data path, but only for 1656 * debug purposes. User-owned mempool caches are not accounted for. 1657 * 1658 * @param mp 1659 * A pointer to the mempool structure. 1660 * @return 1661 * The number of entries in the mempool. 1662 */ 1663 unsigned int rte_mempool_avail_count(const struct rte_mempool *mp); 1664 1665 /** 1666 * Return the number of elements which have been allocated from the mempool 1667 * 1668 * When cache is enabled, this function has to browse the length of 1669 * all lcores, so it should not be used in a data path, but only for 1670 * debug purposes. 1671 * 1672 * @param mp 1673 * A pointer to the mempool structure. 1674 * @return 1675 * The number of free entries in the mempool. 1676 */ 1677 unsigned int 1678 rte_mempool_in_use_count(const struct rte_mempool *mp); 1679 1680 /** 1681 * Test if the mempool is full. 1682 * 1683 * When cache is enabled, this function has to browse the length of all 1684 * lcores, so it should not be used in a data path, but only for debug 1685 * purposes. User-owned mempool caches are not accounted for. 1686 * 1687 * @param mp 1688 * A pointer to the mempool structure. 1689 * @return 1690 * - 1: The mempool is full. 1691 * - 0: The mempool is not full. 1692 */ 1693 static inline int 1694 rte_mempool_full(const struct rte_mempool *mp) 1695 { 1696 return rte_mempool_avail_count(mp) == mp->size; 1697 } 1698 1699 /** 1700 * Test if the mempool is empty. 1701 * 1702 * When cache is enabled, this function has to browse the length of all 1703 * lcores, so it should not be used in a data path, but only for debug 1704 * purposes. User-owned mempool caches are not accounted for. 1705 * 1706 * @param mp 1707 * A pointer to the mempool structure. 1708 * @return 1709 * - 1: The mempool is empty. 1710 * - 0: The mempool is not empty. 1711 */ 1712 static inline int 1713 rte_mempool_empty(const struct rte_mempool *mp) 1714 { 1715 return rte_mempool_avail_count(mp) == 0; 1716 } 1717 1718 /** 1719 * Return the IO address of elt, which is an element of the pool mp. 1720 * 1721 * @param elt 1722 * A pointer (virtual address) to the element of the pool. 1723 * @return 1724 * The IO address of the elt element. 1725 * If the mempool was created with RTE_MEMPOOL_F_NO_IOVA_CONTIG, the 1726 * returned value is RTE_BAD_IOVA. 1727 */ 1728 static inline rte_iova_t 1729 rte_mempool_virt2iova(const void *elt) 1730 { 1731 const struct rte_mempool_objhdr *hdr; 1732 hdr = (const struct rte_mempool_objhdr *)RTE_PTR_SUB(elt, 1733 sizeof(*hdr)); 1734 return hdr->iova; 1735 } 1736 1737 /** 1738 * Check the consistency of mempool objects. 1739 * 1740 * Verify the coherency of fields in the mempool structure. Also check 1741 * that the cookies of mempool objects (even the ones that are not 1742 * present in pool) have a correct value. If not, a panic will occur. 1743 * 1744 * @param mp 1745 * A pointer to the mempool structure. 1746 */ 1747 void rte_mempool_audit(struct rte_mempool *mp); 1748 1749 /** 1750 * Return a pointer to the private data in an mempool structure. 1751 * 1752 * @param mp 1753 * A pointer to the mempool structure. 1754 * @return 1755 * A pointer to the private data. 1756 */ 1757 static inline void *rte_mempool_get_priv(struct rte_mempool *mp) 1758 { 1759 return (char *)mp + 1760 RTE_MEMPOOL_HEADER_SIZE(mp, mp->cache_size); 1761 } 1762 1763 /** 1764 * Dump the status of all mempools on the console 1765 * 1766 * @param f 1767 * A pointer to a file for output 1768 */ 1769 void rte_mempool_list_dump(FILE *f); 1770 1771 /** 1772 * Search a mempool from its name 1773 * 1774 * @param name 1775 * The name of the mempool. 1776 * @return 1777 * The pointer to the mempool matching the name, or NULL if not found. 1778 * NULL on error 1779 * with rte_errno set appropriately. Possible rte_errno values include: 1780 * - ENOENT - required entry not available to return. 1781 * 1782 */ 1783 struct rte_mempool *rte_mempool_lookup(const char *name); 1784 1785 /** 1786 * Get the header, trailer and total size of a mempool element. 1787 * 1788 * Given a desired size of the mempool element and mempool flags, 1789 * calculates header, trailer, body and total sizes of the mempool object. 1790 * 1791 * @param elt_size 1792 * The size of each element, without header and trailer. 1793 * @param flags 1794 * The flags used for the mempool creation. 1795 * Consult rte_mempool_create() for more information about possible values. 1796 * The size of each element. 1797 * @param sz 1798 * The calculated detailed size the mempool object. May be NULL. 1799 * @return 1800 * Total size of the mempool object. 1801 */ 1802 uint32_t rte_mempool_calc_obj_size(uint32_t elt_size, uint32_t flags, 1803 struct rte_mempool_objsz *sz); 1804 1805 /** 1806 * Walk list of all memory pools 1807 * 1808 * @param func 1809 * Iterator function 1810 * @param arg 1811 * Argument passed to iterator 1812 */ 1813 void rte_mempool_walk(void (*func)(struct rte_mempool *, void *arg), 1814 void *arg); 1815 1816 /** 1817 * @internal Get page size used for mempool object allocation. 1818 * This function is internal to mempool library and mempool drivers. 1819 */ 1820 int 1821 rte_mempool_get_page_size(struct rte_mempool *mp, size_t *pg_sz); 1822 1823 /** 1824 * Mempool event type. 1825 * @internal 1826 */ 1827 enum rte_mempool_event { 1828 /** Occurs after a mempool is fully populated. */ 1829 RTE_MEMPOOL_EVENT_READY = 0, 1830 /** Occurs before the destruction of a mempool begins. */ 1831 RTE_MEMPOOL_EVENT_DESTROY = 1, 1832 }; 1833 1834 /** 1835 * @internal 1836 * Mempool event callback. 1837 * 1838 * rte_mempool_event_callback_register() may be called from within the callback, 1839 * but the callbacks registered this way will not be invoked for the same event. 1840 * rte_mempool_event_callback_unregister() may only be safely called 1841 * to remove the running callback. 1842 */ 1843 typedef void (rte_mempool_event_callback)( 1844 enum rte_mempool_event event, 1845 struct rte_mempool *mp, 1846 void *user_data); 1847 1848 /** 1849 * @internal 1850 * Register a callback function invoked on mempool life cycle event. 1851 * The function will be invoked in the process 1852 * that performs an action which triggers the callback. 1853 * 1854 * @param func 1855 * Callback function. 1856 * @param user_data 1857 * User data. 1858 * 1859 * @return 1860 * 0 on success, negative on failure and rte_errno is set. 1861 */ 1862 __rte_internal 1863 int 1864 rte_mempool_event_callback_register(rte_mempool_event_callback *func, 1865 void *user_data); 1866 1867 /** 1868 * @internal 1869 * Unregister a callback added with rte_mempool_event_callback_register(). 1870 * @p func and @p user_data must exactly match registration parameters. 1871 * 1872 * @param func 1873 * Callback function. 1874 * @param user_data 1875 * User data. 1876 * 1877 * @return 1878 * 0 on success, negative on failure and rte_errno is set. 1879 */ 1880 __rte_internal 1881 int 1882 rte_mempool_event_callback_unregister(rte_mempool_event_callback *func, 1883 void *user_data); 1884 1885 #ifdef __cplusplus 1886 } 1887 #endif 1888 1889 #endif /* _RTE_MEMPOOL_H_ */ 1890