当前位置: 首页 > 工具软件 > mempool > 使用案例 >

[dpdk]mempool使用

卫宏硕
2023-12-01

头文件: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)             内存池节点数量,最好是 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)

 类似资料: