本文整理下之前的学习笔记,基于DPDK17.11版本源码,主要分析无锁队列ring的实现。
rte_ring_tailq保存rte_ring链表
创建ring后会将其插入共享内存链表rte_ring_tailq,以便主从进程都可以访问。
//定义队列头结构 struct rte_tailq_elem_head
TAILQ_HEAD(rte_tailq_elem_head, rte_tailq_elem);
//声明全局变量rte_tailq_elem_head,类型为struct rte_tailq_elem_head,
//相当于是链表头,用来保存本进程注册的队列
/* local tailq list */
static struct rte_tailq_elem_head rte_tailq_elem_head =
TAILQ_HEAD_INITIALIZER(rte_tailq_elem_head);
//调用EAL_REGISTER_TAILQ在main函数前注册rte_ring_tailq到全局变量rte_tailq_elem_head。
#define RTE_TAILQ_RING_NAME "RTE_RING"
static struct rte_tailq_elem rte_ring_tailq = {
.name = RTE_TAILQ_RING_NAME,
};
EAL_REGISTER_TAILQ(rte_ring_tailq)
调用rte_eal_tailq_update遍历链表rte_tailq_