rte_malloc.h(3)
π rte_malloc.h(3) π
okay so this is the DPDK page for rte_malloc.h and bestie, it's a whole vibe β¨ β it's the malloc situation for hugepages. Buckle up, we're going through literally all of it, no skips π
πΈ SYNOPSIS πΈ
#include <stdio.h>
#include <stddef.h>
#include <rte_memory.h>
π Data Structures π
struct rte_malloc_socket_stats
π¦ Macros π¦
#define __rte_dealloc_free __rte_dealloc(rte_free, 1)
β Functions β
void rte_free (void *ptr)
__rte_experimental void rte_free_sensitive (void *ptr)
void * rte_malloc (const char *type, size_t size, unsigned align)
__rte_alloc_size(2) __rte_alloc_align(3) __rte_malloc
__rte_dealloc_free
void * rte_zmalloc (const char *type, size_t size, unsigned align)
__rte_alloc_size(2) __rte_alloc_align(3) __rte_malloc
__rte_dealloc_free
void * rte_calloc (const char *type, size_t num, size_t size, unsigned
align) __rte_alloc_size(2
void * rte_realloc (void *ptr, size_t size, unsigned int align)
__rte_alloc_size(2) __rte_alloc_align(3) __rte_malloc
__rte_dealloc_free
void * rte_realloc_socket (void *ptr, size_t size, unsigned int align,
int socket) __rte_alloc_size(2) __rte_alloc_align(3) __rte_malloc
__rte_dealloc_free
void * rte_malloc_socket (const char *type, size_t size, unsigned align,
int socket) __rte_alloc_size(2) __rte_alloc_align(3) __rte_malloc
__rte_dealloc_free
void * rte_zmalloc_socket (const char *type, size_t size, unsigned
align, int socket) __rte_alloc_size(2) __rte_alloc_align(3)
__rte_malloc __rte_dealloc_free
void * rte_calloc_socket (const char *type, size_t num, size_t size,
unsigned align, int socket) __rte_alloc_size(2
int rte_malloc_validate (const void *ptr, size_t *size)
int rte_malloc_get_socket_stats (int socket, struct
rte_malloc_socket_stats *socket_stats)
int rte_malloc_heap_memory_add (const char *heap_name, void *va_addr,
size_t len, rte_iova_t iova_addrs[], unsigned int n_pages, size_t
page_sz)
int rte_malloc_heap_memory_remove (const char *heap_name, void *va_addr,
size_t len)
int rte_malloc_heap_memory_attach (const char *heap_name, void *va_addr,
size_t len)
int rte_malloc_heap_memory_detach (const char *heap_name, void *va_addr,
size_t len)
int rte_malloc_heap_create (const char *heap_name)
int rte_malloc_heap_destroy (const char *heap_name)
int rte_malloc_heap_get_socket (const char *name)
int rte_malloc_heap_socket_is_external (int socket_id)
void rte_malloc_dump_stats (FILE *f, const char *type)
void rte_malloc_dump_heaps (FILE *f)
rte_iova_t rte_malloc_virt2iova (const void *addr)
β¨ Detailed Description β¨
RTE Malloc. This library is literally your go-to for dynamically allocating memory out of hugepages π§ β it's giving "let me grab some memory for you bestie" energy.
Definition in file rte_malloc.h.
π Macro Definition Documentation π
π #define __rte_dealloc_free __rte_dealloc(rte_free, 1)
Functions that expect return value to be freed with rte_free() π
(so like, if you're getting something back from these, it's rte_free()'s job to clean it up, periodt).
Definition at line 37 of file rte_malloc.h.
π Function Documentation π
π void rte_free (void * ptr)
Frees the memory space pointed to by the provided pointer. Slay, memory reclaimed β¨
This pointer must have been returned by a previous call to rte_malloc(), rte_zmalloc(), rte_calloc() or rte_realloc(). The behaviour of rte_free() is undefined if the pointer does not match this requirement π β so like, do not just hand it a random pointer, that's not the move.
If the pointer is NULL, the function does nothing. Chill. No drama π
Parameters:
- ptr β The pointer to memory to be freed.
π __rte_experimental void rte_free_sensitive (void * ptr)
Warning β EXPERIMENTAL: this API may change without prior notice. β οΈ So like, don't build your whole personality on it.
Frees the memory space pointed to by the provided pointer and guarantees it will be zero'd before reuse π₯ β yes, that's the whole point. This function is slower than simple rte_free() and it should only be used for security keys and other sensitive data π (iykyk β you use this when the data is the kind you can't have lingering).
This pointer must have been returned by a previous call to rte_malloc(), rte_zmalloc(), rte_calloc() or rte_realloc(). The behaviour of rte_free() is undefined if the pointer does not match this requirement π
If the pointer is NULL, the function does nothing.
Parameters:
- ptr β The pointer to memory to be freed.
π¦ void* rte_malloc (const char * type, size_t size, unsigned align)
This function allocates memory from the huge-page area of memory. The memory is not cleared π«Ά. In NUMA systems, the memory allocated resides on the same NUMA socket as the core that calls this function β same-socket energy, we love to see it.
Parameters:
- type β A string identifying the type of allocated objects (useful for tracing). Can be
NULL. - size β Size (in bytes) to be allocated.
- align β If
0, the return is a pointer that is suitably aligned for any kind of variable (in the same manner asmalloc()). Otherwise, the return is a pointer that is a multiple of align. In this case, it must be a power of two. (Minimum alignment is the cacheline size, i.e. 64-bytes)
Returns:
NULLon error. Not enough memory, or invalid arguments (size is0, align is not a power of two).- Otherwise, the pointer to the allocated object π
πΈ void* rte_zmalloc (const char * type, size_t size, unsigned align)
Allocate zeroed memory from the heap β¨
Equivalent to rte_malloc() except that the memory zone is initialised with zeros. In NUMA systems, the memory allocated resides on the same NUMA socket as the core that calls this function.
Parameters:
- type β A string identifying the type of allocated objects (useful for tracing). Can be
NULL. - size β Size (in bytes) to be allocated.
- align β If
0, the return is a pointer that is suitably aligned for any kind of variable (in the same manner asmalloc()). Otherwise, the return is a pointer that is a multiple of align. In this case, it must obviously be a power of two. (Minimum alignment is the cacheline size, i.e. 64-bytes)
Returns:
NULLon error. Not enough memory, or invalid arguments (size is0, align is not a power of two).- Otherwise, the pointer to the allocated object π
π void* rte_calloc (const char * type, size_t num, size_t size, unsigned align)
Replacement function for calloc(), using huge-page memory. Memory area is initialised with zeros π§ In NUMA systems, the memory allocated resides on the same NUMA socket as the core that calls this function.
Parameters:
- type β A string identifying the type of allocated objects (useful for tracing). Can be
NULL. - num β Number of elements to be allocated.
- size β Size (in bytes) of a single element.
- align β If
0, the return is a pointer that is suitably aligned for any kind of variable (in the same manner asmalloc()). Otherwise, the return is a pointer that is a multiple of align. In this case, it must obviously be a power of two. (Minimum alignment is the cacheline size, i.e. 64-bytes)
Returns:
NULLon error. Not enough memory, or invalid arguments (size is0, align is not a power of two).- Otherwise, the pointer to the allocated object π
π₯ void* rte_realloc (void * ptr, size_t size, unsigned int align)
Replacement function for realloc(), using huge-page memory. Reserved area memory is resized, preserving contents π In NUMA systems, the new area may not reside on the same NUMA node as the old one β lowkey a glow-up that moved neighborhoods, ngl.
Parameters:
- ptr β Pointer to already allocated memory
- size β Size (in bytes) of new area. If this is
0, memory is freed. - align β If
0, the return is a pointer that is suitably aligned for any kind of variable (in the same manner asmalloc()). Otherwise, the return is a pointer that is a multiple of align. In this case, it must obviously be a power of two. (Minimum alignment is the cacheline size, i.e. 64-bytes)
Returns:
NULLon error. Not enough memory, or invalid arguments (size is0, align is not a power of two).- Otherwise, the pointer to the reallocated memory π«
β void* rte_realloc_socket (void * ptr, size_t size, unsigned int align, int socket)
Replacement function for realloc(), using huge-page memory. Reserved area memory is resized, preserving contents. In NUMA systems, the new area resides on the requested NUMA socket π― (you picked the socket, you get the socket, main character energy).
Parameters:
- ptr β Pointer to already allocated memory
- size β Size (in bytes) of new area. If this is
0, memory is freed. - align β If
0, the return is a pointer that is suitably aligned for any kind of variable (in the same manner asmalloc()). Otherwise, the return is a pointer that is a multiple of align. In this case, it must obviously be a power of two. (Minimum alignment is the cacheline size, i.e. 64-bytes) - socket β NUMA socket to allocate memory on.
Returns:
NULLon error. Not enough memory, or invalid arguments (size is0, align is not a power of two).- Otherwise, the pointer to the reallocated memory π«Ά
π void* rte_malloc_socket (const char * type, size_t size, unsigned align, int socket)
This function allocates memory from the huge-page area of memory. The memory is not cleared.
Parameters:
- type β A string identifying the type of allocated objects (useful for tracing). Can be
NULL. - size β Size (in bytes) to be allocated.
- align β If
0, the return is a pointer that is suitably aligned for any kind of variable (in the same manner asmalloc()). Otherwise, the return is a pointer that is a multiple of align. In this case, it must obviously be a power of two. (Minimum alignment is the cacheline size, i.e. 64-bytes) - socket β NUMA socket to allocate memory on. If
SOCKET_ID_ANYis used, this function will behave the same asrte_malloc().
Returns:
NULLon error. Not enough memory, or invalid arguments (size is0, align is not a power of two).- Otherwise, the pointer to the allocated object π
π¦ void* rte_zmalloc_socket (const char * type, size_t size, unsigned align, int socket)
Allocate zeroed memory from the heap β¨
Equivalent to rte_malloc() except that the memory zone is initialised with zeros.
Parameters:
- type β A string identifying the type of allocated objects (useful for tracing). Can be
NULL. - size β Size (in bytes) to be allocated.
- align β If
0, the return is a pointer that is suitably aligned for any kind of variable (in the same manner asmalloc()). Otherwise, the return is a pointer that is a multiple of align. In this case, it must obviously be a power of two. (Minimum alignment is the cacheline size, i.e. 64-bytes) - socket β NUMA socket to allocate memory on. If
SOCKET_ID_ANYis used, this function will behave the same asrte_zmalloc().
Returns:
NULLon error. Not enough memory, or invalid arguments (size is0, align is not a power of two).- Otherwise, the pointer to the allocated object π
π
void* rte_calloc_socket(...)
void* rte_calloc_socket (const char * type, size_t num, size_t size,
unsigned align, int socket)
Okay so this is the replacement function for calloc(), but make it huge-page memory β¨. And the memory area? It gets initialised with zeros, so no gross leftover garbage data, she's clean.
Parameters (the whole roster, bestie):
typeβ a string identifying the type of allocated objects. It's useful for tracing. Can beNULL, no pressure.numβ Number of elements to be allocated.sizeβ Size (in bytes) of a single element.alignβ If0, the return is a pointer that is suitably aligned for any kind of variable (in the same manner asmalloc()). Otherwise, the return is a pointer that is a multiple ofalign. In that case it must obviously be a power of two π₯. (Minimum alignment is the cacheline size, i.e.64-bytes, so don't get cute with it.)socketβ NUMA socket to allocate memory on. IfSOCKET_ID_ANYis used, this function will behave the same asrte_calloc().
Returns:
NULLon error. Either not enough memory, or invalid arguments (sizeis0, oralignis not a power of two). Not us failing a vibe check, just math.- Otherwise, the pointer to the allocated object π
π΅οΈ int rte_malloc_validate(...)
int rte_malloc_validate (const void * ptr, size_t * size)
If malloc debug is enabled, this lil detective checks a memory block for header and trailer markers to make sure everything is, in fact, all well with the block π. And if size is non-null, she also returns the size of the block. Very generous.
Parameters:
ptrβ pointer to the start of a data block, and it must have been returned by a previous call torte_malloc(),rte_zmalloc(),rte_calloc()orrte_realloc(). No random pointers, please, that's giving chaos πsizeβ if non-null, and the memory block pointer is valid, returns the size of the memory block.
Returns: -1 on error, invalid pointer passed, or header and trailer markers are missing or corrupted. 0 on success β
π int rte_malloc_get_socket_stats(...)
int rte_malloc_get_socket_stats (int socket, struct rte_malloc_socket_stats
* socket_stats)
Get heap statistics for the specified heap. Numbers, but make it fashion π
Note: This function is not thread-safe with respect torte_malloc_heap_create()/rte_malloc_heap_destroy()functions. Lowkey important, don't say I didn't warn you π«Ά
Parameters:
socketβ An unsigned integer specifying the socket to get heap statistics for.socket_statsβ A structure which provides memory to store statistics.
Returns: Null on error, pointer to structure storing statistics on success. (And yes, the doc literally says "Null" and "Pointer" for a function that returns int β the docs are just quirky like that, not my fault π)
π§± int rte_malloc_heap_memory_add(...)
int rte_malloc_heap_memory_add (const char * heap_name, void * va_addr,
size_t len, rte_iova_t iova_addrs[], unsigned int n_pages, size_t
page_sz)
Add a memory chunk to a heap with specified name. Feeding the heap, icon behaviour π
Notes, and these are loud ones: - Multiple memory chunks can be added to the same heap. - Before accessing this memory in other processes, it needs to be attached in each of those processes by calling rte_malloc_heap_memory_attach in each other process. - Memory must be previously allocated for DPDK to be able to use it as a malloc heap. Failing to do so will result in undefined behavior, up to and including segmentation faults. Genuinely do not test this one π - Calling this function will erase any contents already present at the supplied memory address. So like, if you had stuff there, it's gone. Poof. π
Parameters:
heap_nameβ Name of the heap to add memory chunk to.va_addrβ Start of virtual area to add to the heap. Must be aligned bypage_sz.lenβ Length of virtual area to add to the heap. Must be aligned bypage_sz.iova_addrsβ Array of page IOVA addresses corresponding to each page in this memory area. Can beNULL, in which case page IOVA addresses will be set toRTE_BAD_IOVA.n_pagesβ Number of elements in theiova_addrsarray. Ignored ifiova_addrsisNULL.page_szβ Page size of the underlying memory.
Returns:
0on success π-1in case of error, withrte_errnoset to one of the following:EINVALβ one of the parameters was invalid;EPERMβ attempted to add memory to a reserved heap;ENOSPCβ no more space in internal config to store a new memory chunk.
ποΈ int rte_malloc_heap_memory_remove(...)
int rte_malloc_heap_memory_remove (const char * heap_name, void * va_addr,
size_t len)
Remove a memory chunk from the heap with the specified name. It's giving cleanup era π§Ή
Notes: - Memory chunk being removed must be the same as one that was added; partially removing memory chunks is not supported. All or nothing, periodt. - Memory area must not contain any allocated elements to allow its removal from the heap. - All other processes must detach from the memory chunk prior to it being removed from the heap.
Parameters:
heap_nameβ Name of the heap to remove memory from.va_addrβ Virtual address to remove from the heap.lenβ Length of virtual area to remove from the heap.
Returns:
0on success β¨-1in case of error, withrte_errnoset to one of the following:EINVALβ one of the parameters was invalid;EPERMβ attempted to remove memory from a reserved heap;ENOENTβ heap or memory chunk was not found;EBUSYβ memory chunk still contains data.
π int rte_malloc_heap_memory_attach(...)
int rte_malloc_heap_memory_attach (const char * heap_name, void * va_addr,
size_t len)
Attach to an already existing chunk of external memory in another process. Long-distance relationship but make it shared memory π¦
Note: This function must be called before any attempt is made to use an already existing external memory chunk. This function does not need to be called if a call to rte_malloc_heap_memory_add was made in the current process. iykyk.
Parameters:
heap_nameβ Heap name to which this chunk of memory belongs.va_addrβ Start address of memory chunk to attach to.lenβ Length of memory chunk to attach to.
Returns: 0 on successful attach; -1 on unsuccessful attach, with rte_errno set to indicate cause for error: EINVAL β one of the parameters was invalid; EPERM β attempted to attach memory to a reserved heap; ENOENT β heap or memory chunk was not found.
βοΈ int rte_malloc_heap_memory_detach(...)
int rte_malloc_heap_memory_detach (const char * heap_name, void * va_addr,
size_t len)
Detach from a chunk of external memory in secondary process. It's not me, it's the memory chunk π
Note: This function must be called in before any attempt is made to remove external memory from the heap in another process. This function does not need to be called if a call to rte_malloc_heap_memory_remove will be called in current process.
Parameters:
heap_nameβ Heap name to which this chunk of memory belongs.va_addrβ Start address of memory chunk to attach to.lenβ Length of memory chunk to attach to.
Returns: 0 on successful detach; -1 on unsuccessful detach, with rte_errno set to indicate cause for error: EINVAL β one of the parameters was invalid; EPERM β attempted to detach memory from a reserved heap; ENOENT β heap or memory chunk was not found.
π int rte_malloc_heap_create(...)
int rte_malloc_heap_create (const char * heap_name)
Creates a new empty malloc heap with a specified name. Main character energy, brand new, untouched β¨
Note: Heaps created via this call will automatically get assigned a unique socket ID, which can be found using rte_malloc_heap_get_socket(). Cute, she comes with her own ID π
Parameters:
heap_nameβ Name of the heap to create.
Returns:
0on successful creation πΈ-1in case of error, withrte_errnoset to one of the following:EINVALβheap_namewasNULL, empty or too long;EEXISTβ heap by name ofheap_namealready exists;ENOSPCβ no more space in internal config to store a new heap.
π int rte_malloc_heap_destroy(...)
int rte_malloc_heap_destroy (const char * heap_name)
Destroys a previously created malloc heap with specified name. Rest in peace, heap ποΈ
Notes: - This function will return a failure result if not all memory allocated from the heap has been freed back to the heap. - This function will return a failure result if not all memory segments were removed from the heap prior to its destruction.
Parameters:
heap_nameβ Name of the heap to create. (that is literally what the docs say, even though we're destroying it β copy-paste moment, iykyk π)
Returns:
0on success β-1in case of error, withrte_errnoset to one of the following:EINVALβheap_namewasNULL, empty or too long;ENOENTβ heap by the name ofheap_namewas not found;EPERMβ attempting to destroy reserved heap;EBUSYβ heap still contains data.
π int rte_malloc_heap_get_socket(...)
int rte_malloc_heap_get_socket (const char * name)
Find the socket ID corresponding to a named heap. Matching besties to their IDs π«Ά
Parameters:
nameβ Heap name to find socket ID for.
Returns: Socket ID in case of success (a non-negative number); -1 in case of error, with rte_errno set to one of the following: EINVAL β name was NULL; ENOENT β heap identified by the name name was not found.
π int rte_malloc_heap_socket_is_external(...)
int rte_malloc_heap_socket_is_external (int socket_id)
Check if a given socket ID refers to externally allocated memory. Vibe check on the socket π
Note: PassingSOCKET_ID_ANYwill return0.
Parameters:
socket_idβ Socket ID to check.
Returns: 1 if socket ID refers to externally allocated memory; 0 if socket ID refers to internal DPDK memory; -1 if socket ID is invalid.
π void rte_malloc_dump_stats(...)
void rte_malloc_dump_stats (FILE * f, const char * type)
Dump statistics. Dump for the specified type to a file. If the type argument is NULL, all memory types will be dumped. Every single one, no crumbs left π
Note: This function is not thread-safe with respect torte_malloc_heap_create()/rte_malloc_heap_destroy()functions.
Parameters:
fβ A pointer to a file for output.typeβ Deprecated parameter, unused. She's retired, leave her be π
ποΈ void rte_malloc_dump_heaps(...)
void rte_malloc_dump_heaps (FILE * f)
Dump the contents of all malloc heaps to a file. Full tour of the whole lineup π
Note: This function is not thread-safe with respect torte_malloc_heap_create()/rte_malloc_heap_destroy()functions.
Parameters:
fβ A pointer to a file for output.
π§ rte_iova_t rte_malloc_virt2iova(...)
rte_iova_t rte_malloc_virt2iova (const void * addr)
Return the IO address of a virtual address obtained through rte_malloc. Glow-up from virtual to IO π₯
Parameters:
addrβ Address obtained from a previousrte_malloccall.
Returns: RTE_BAD_IOVA on error, otherwise return an address suitable for IO β¨
π Author π
Generated automatically by Doxygen for DPDK from the source code. Not a human, just a very diligent little doc machine doing its thing π€π
Okay bestie, that's the whole page β every last flag, error code, and note, intact and accounted for π
This was rte_malloc.h(3) from DPDK version 25.11.0, dated Fri Jan 30 2026 β go forth and allocate responsibly, mwah π«ΆπΈ
π¦ where this page comes from
- centos-stream 9: dpdk-devel 2:25.11-1.el9 Β· BSD and LGPLv2 and GPLv2
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms