头文件:lib/librte_mempool/rte_mempool.h
创建内存池
struct rte_mempool *
rte_mempool_create(const char *name, unsigned n, unsigned elt_size,
unsigned cache_size, unsigned private_data_size,
rte_mempool_ctor_t *mp_init, void *mp_init_arg,
rte_mempool_obj_cb_t *obj_init, void *obj_init_arg,
int socket_id, unsigned flags);
参数:
1)name 内存池名称,同一个进程内不允许重复
2)n 内存池节点数量,最好是 2 的幂次 -1,n = (2^q - 1)
3)elt_size 单个节点占用的字节数量。
4)cache_size 待研究,不用可为0
5)private_data_size 可在mempool结构体后面追加私有数据,未用过,不用可为0
6)mp_init 内存池初次申请后,对mempool结构体进行一些初始化操作,可为NULL
7)mp_init_arg 对mempool结构体进行初始化需要的参数,可为NULL
8)obj_init 内存池初次申请后,对每个节点元素进行初始化,可为NULL
9)obj_init_arg 调用 obj_init 时可传入自定义的参数,可为NULL
10)socket_id numa架构下,输入有效值,非numa情况下,可为SOCKET_ID_ANY
11)flags 可填值如下:
a. MEMPOOL_F_NO_SPREAD 0x0001 默认情况下,节点在ram的通道间传递,且申请时会给每个节点进行填充以保证内存对齐,设置此flag后,只将节点进行对齐(估计应该不会填充)
b. MEMPOOL_F_NO_CACHE_ALIGN 0x0002 默认情况下,节点是cache-aligned,设置此flag,关闭cache-aligned,也不会填充。
c. MEMPOOL_F_SP_PUT 0x0004 设置后,rte_mempool_put() or rte_mempool_put_bulk() 变成单入模式,否则是多入模式。
d. MEMPOOL_F_SC_GET 0x0008 设置后,rte_mempool_get() or rte_mempool_get_bulk() 变成单出模式,否则是多出模式。
e. MEMPOOL_F_NO_IOVA_CONTIG 0x0020 设置后,则分配的对象在IO内存中不一定是连续的。总结:flags = 0 表示cache-aligned,且多入多出。
申请内存:
static __rte_always_inline int
rte_mempool_get(struct rte_mempool *mp, void **obj_p)
static __rte_always_inline int
rte_mempool_get_bulk(struct rte_mempool *mp, void **obj_table, unsigned int n)
说明:
如果启用了缓存,对象将首先从缓存中检索,然后从公共池中检索。注意,当本地缓存和公共池为空时,它可以返回-ENOENT,即使来自其他lcores的缓存已满。---未研究
返回值:0申请成功,ENOENT: 没有足够的节点供申请,申请失败。
释放内存:
static __rte_always_inline void
rte_mempool_put(struct rte_mempool *mp, void *obj)
static __rte_always_inline void
rte_mempool_put_bulk(struct rte_mempool *mp, void * const *obj_table, unsigned int n)