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