l2fwd收发队列的分析。

以l2fwd程序举例(igb为例)

1 收队列

1.1 收队列的建立

1,rte_eth_rx_queue_setup调用eth_igb_rx_queue_setup来创建队列,会根据需求创建同样数量的sw_ring 核rx_ring,如下图所示,dev->data->rx_queues[queue_idx]=rxq.

1.2 入队列

l2fwd使用rte_eth_tx_burst结构发送包,通过函数指针tx_pkt_burst,调用eth_igb_xmit_pkts发包,eth_igb_xmit_pkts的流程如下图

1.2.1 rte_pktmbuf_free_seg

rte_pktmbuf_free_seg用于把内存还给队列,会调用rte_mbuf_raw_free,rte_mbuf_raw_free调用rte_mempool_put,

rte_mempool_put调用rte_mempool_put_bulk,rte_mempool_put_bulk调用rte_mempool_generic_put,rte_mempool_generic_put调用__mempool_generic_put,

rte_mempool_generic_put的流程如下图

1.2.2 rte_mempool_ops_enqueue_bulk

rte_mempool_ops_enqueue_bulk通过函数指针enqueue从队列中出队列,enqueue对应多种方法,根据mp->ops_index来确定,本文主要分析common_ring_sc_dequeue,

common_ring_sc_dequeue调用rte_ring_sc_dequeue_bulk,rte_ring_sc_dequeue_bulk调用__rte_ring_do_dequeue。

1.3 出队列

l2fwd使用rte_eth_rx_burst接口收包,通过函数指针rx_pkt_burst,调用eth_igb_recv_pkts进行收包,eth_igb_recv_pkts的流程如图

1.3.1 rte_mbuf_raw_alloc

rte_mbuf_raw_alloc接口用于分配mbuf,主要是调用rte_mempool_get接口,rte_mempool_get接口再调用rte_mempool_get_bulk,rte_mempool_get_bulk再调用__mempool_generic_get接口

1.3.2 rte_mempool_ops_dequeue_bulk

rte_mempool_ops_dequeue_bulk通过函数指针dequeue从队列中出队列,dequeue对应多种方法,根据mp->ops_index来确定,本文主要分析common_ring_mc_dequeue

common_ring_mc_dequeue调用rte_ring_mc_dequeue_bulk,rte_ring_mc_dequeue_bulk调用__rte_ring_do_dequeue,队列的结构如下图

1.3.2.1 ring队列的创建

ring队列的创建是通过mempool_ops_alloc_once创建的,mempool_ops_alloc_once调用rte_mempool_ops_alloc,rte_mempool_ops_alloc根据ops_index,查找对应alloc接口,本文主要讲ring队列调用的是common_ring_alloc接口

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值