源码过程简略说明:
1、 rte_mempool_create 接口调用 rte_mempool_create_empty 创建内存池
2、 rte_mempool_create_empty
调用 rte_memzone_reserve 申请 struct rte_memzone *mz变量,struct rte_mempool *mp来自 mz。 待 mp 初始化后,加入单链表 rte_mempool_tailq 内。
3、 rte_pktmbuf_pool_create 接口经过 rte_pktmbuf_pool_create_by_ops 调用 rte_mempool_create_empty 创建内存池。
综上,可通过遍历 单链表 rte_mempool_tailq 来获取 rte 内部使用的所有内存池信息。正好 rte 封装了几个可用的函数:
void rte_mempool_list_dump(FILE *f)
该函数遍历内存池链表,将每个内存池信息,包括名称、数据地址、节点大小和数量都写到入参的 FILE *p 中。
struct rte_mempool *rte_mempool_lookup(const char *name)
该函数遍历链表,比较入参和内存池名称来获取内存池指针。
void rte_mempool_walk(void (*func)(struct rte_mempool *, void *),
void *arg)
该函数第一个参数是函数指针,第二个参数可选参数,函数内部遍历链表,将各个内存池指针和 arg 作为 func 的入参。通过此函数,用户可自定义一些对内存池的操作,比如计算总量、获取统计信息等。