22 #ifdef RTE_RING_SPLIT_PROD_CONS 23 } cons __rte_cache_aligned; 24 #else 25 } cons; 26 #endif 27 28 #ifdef RTE_LIBRTE_RING_DEBUG 29 struct rte_ring_debug_stats stats[RTE_MAX_LCORE]; 30 #endif 31 32 void * ring[0] __rte_cache_aligned; /**< Memory space of ring starts ...
dpdk在rte_ring_list链表中创建一个rte_tailq_entry节点,在memzone中根据队列的大小count申请一块内存(rte_ring的大小加上count*sizeof(void *))。紧邻着rte_ring结构的void *数组用于放置入队的对象(单纯的赋值指针值)。rte_ring结构中有生产者结构prod、消费者结构cons,初始化参数之后,把rte_tailq_entry的data节...
struct rte_ring *r = rte_ring_create(“MY_RING”,1024,rte_socket_id,0); 2.出入队 有不同的出入队方式(单、bulk、burst)都在rte_ring.h中。 例如: rte_ring_enqueue 和 rte_ring_dequeue 这种数据结构与链表队列相比: 优点如下: 更快:比较void *大小的数据,只需要执行单次Compare-And-Swap指令,...
调用rte_eal_tailq_update遍历链表rte_tailq_elem_head上的节点,将节点中的head指向 struct rte_mem_ring->tailq_head[]数组中的一个tailq_head,此head又作为另一个链表头。比如注册的rte_ring_tailq节点,其head专门用来保存创建的rte_ring(将rte_ring作为struct rte_tailq_entry的data,将struct rte_tailq_entry...
static inline int __attribute__((always_inline))__rte_ring_sc_do_dequeue(struct rte_ring *r, void **obj_table,unsigned n, enum rte_ring_queue_behavior behavior){uint32_t cons_head, prod_tail;uint32_t cons_next, entries;unsigned i;uint32_t mask = r->prod.mask;cons_head = r->...
1.创建一个ring对象。 2. 出入队 有不同的出入队方式(单、bulk、burst)都在rte_ring.h中。 例如: rte_ring_enqueue 和 rte_ring_dequeue 这种数据结构与链表队列相比: 优点如下: 缺点如下: 二、rte_ring结构体分析 无锁环形队列的结构体如下:
+-- librte_ring # 软件无锁环形缓冲区 +-- librte_sched # QoS调度器和丢包器库 +-- librte_timer # 定时器库 3) 应用程序 应用程序是包含 main() 函数的源文件。 他们位于 $(RTE_SDK)/app 和 $(RTE_SDK)/examples 目录中。 常用示例文件: ...
//调用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_elem_...
rte_ring DPDK应用使用ring来管理各种对象。ring是一个FIFO队列,大小固定,采用无锁机制。 可以批量进出队列。具体描述如下: FIFO Maximum size is fixed, the pointers are stored in a table Lockless implementation Multi-consumer or single-consumer dequeue ...
{return__rte_ring_do_enqueue(r, obj_table, n, RTE_RING_QUEUE_FIXED, r->prod.single, free_space); } rte_ring_dequeue_burst(structrte_ring *r,void**obj_table, unsignedintn, unsignedint*available) {return__rte_ring_do_dequeue(r, obj_table, n, ...