virtio设备input节点
创始人
2024-05-29 01:08:37
0

注册virtio_input_node节点,节点类型为VLIB_NODE_TYPE_INPUT。

VLIB_REGISTER_NODE (virtio_input_node) = {.name = "virtio-input",.sibling_of = "device-input",.format_trace = format_virtio_input_trace,.flags = VLIB_NODE_FLAG_TRACE_SUPPORTED,.type = VLIB_NODE_TYPE_INPUT,.state = VLIB_NODE_STATE_INTERRUPT,.n_errors = VIRTIO_INPUT_N_ERROR,.error_strings = virtio_input_error_strings,
};

如下,virtio-input节点。

vpp# show node virtio-input
node virtio-input, type input, state disabled, index 432, sibling-of device-inputnode function variants:Name             Priority  Active  Descriptionhsw                    50    yes   Intel Haswelldefault                 0          defaultnext nodes:next-index  node-index               Node               Vectors0          627          ip4-input-no-checksum         01          626                ip4-input               02          589                ip6-input               03          467               mpls-input               04          690             ethernet-input             05          701               error-drop               06          631                ip4-drop                07          595                ip6-drop                08          710              punt-dispatch             09          517            esp4-decrypt-tun            010          519            esp6-decrypt-tun            0

virtio节点对应的处理函数virtio_input_node。首先获得节点运行时所需处理的接收队列向量(p),其次,遍历向量中的每个接收队列,逐一处理,其中接收队列所属的接口处于UP状态,才需要处理。

接收队列向量(p)中的结构vnet_hw_if_rxq_poll_vector_t包含两个成员:virtio接口的索引值(dev_instance),和接收队列索引值(queue_id)。函数virtio_device_input_inline处理设备对应的队列。

节点结构体vlib_node_runtime_t的初始化参见VPP接口INPUT节点运行数据。virtio input节点在不同的线程拥有不同的node运行数据,例如不同线程的virtio input函数处理同一个virtio接口的不同队列。

VLIB_NODE_FN (virtio_input_node) (vlib_main_t * vm,vlib_node_runtime_t * node, vlib_frame_t * frame)
{u32 n_rx = 0;virtio_main_t *vim = &virtio_main;vnet_hw_if_rxq_poll_vector_t *p,*pv = vnet_hw_if_get_rxq_poll_vector (vm, node);vec_foreach (p, pv) {virtio_if_t *vif;vif = vec_elt_at_index (vim->interfaces, p->dev_instance);if (vif->flags & VIRTIO_IF_FLAG_ADMIN_UP){if (vif->type == VIRTIO_IF_TYPE_TAP)n_rx += virtio_device_input_inline (vm, node, frame, vif, p->queue_id, VIRTIO_IF_TYPE_TAP);else if (vif->type == VIRTIO_IF_TYPE_TUN)n_rx += virtio_device_input_inline (vm, node, frame, vif, p->queue_id, VIRTIO_IF_TYPE_TUN);}}return n_rx;

节点state为中断状态VLIB_NODE_STATE_INTERRUPT,由函数vnet_hw_if_generate_rxq_int_poll_vector获取当前已经产生的中断,生成需要处理的向量pv。

否则,节点state不等于中断VLIB_NODE_STATE_INTERRUPT,使用rxq_vector_poll为所需轮询的向量。

以上都不成立的情况下,节点state为VLIB_NODE_STATE_POLLING,返回向量rxq_vector_int。节点的运行state由其处理的所有接收队列来决定,如果其中存在接收队列为VNET_HW_IF_RX_MODE_POLLING接收模式,节点的state优先使用VLIB_NODE_STATE_POLLING。

static_always_inline vnet_hw_if_rxq_poll_vector_t *
vnet_hw_if_get_rxq_poll_vector (vlib_main_t *vm, vlib_node_runtime_t *node)
{  vnet_hw_if_rx_node_runtime_t *rt = (void *) node->runtime_data;vnet_hw_if_rxq_poll_vector_t *pv = rt->rxq_vector_int;if (PREDICT_FALSE (node->state == VLIB_NODE_STATE_INTERRUPT))pv = vnet_hw_if_generate_rxq_int_poll_vector (vm, node);else if (node->flags & VLIB_NODE_FLAG_ADAPTIVE_MODE)pv = rt->rxq_vector_poll;return pv;
}

此函数仅运行在节点状态为VLIB_NODE_STATE_INTERRUPT时,遍历向量rxq_interrupts,依次找到发生中断的接收队列,将接收队列对应的接口索引和队列索引,添加到rxq_vector_int向量中,此向量之后作为函数返回值。清除rxq_interrupts中记录的中断队列值(int_num)。

vnet_hw_if_rxq_poll_vector_t *
vnet_hw_if_generate_rxq_int_poll_vector (vlib_main_t *vm, vlib_node_runtime_t *node)
{vnet_hw_if_rx_node_runtime_t *rt = (void *) node->runtime_data;vnet_main_t *vnm = vnet_get_main ();int int_num = -1;ASSERT (node->state == VLIB_NODE_STATE_INTERRUPT);vec_reset_length (rt->rxq_vector_int);while ((int_num = clib_interrupt_get_next (rt->rxq_interrupts, int_num)) != -1){vnet_hw_if_rx_queue_t *rxq = vnet_hw_if_get_rx_queue (vnm, int_num);vnet_hw_if_rxq_poll_vector_t *pv;clib_interrupt_clear (rt->rxq_interrupts, int_num);vec_add2 (rt->rxq_vector_int, pv, 1);pv->dev_instance = rxq->dev_instance;pv->queue_id = rxq->queue_id;}return rt->rxq_vector_int;

如下,vpp_wk_0线程中,virtio-input节点运行状态为polling。

vpp# show runtime
Thread 1 vpp_wk_0 (lcore 2)
Time 33.3, 10 sec internal node vector rate 0.00 loops/sec 6111789.66vector rates in 1.0214e0, out 1.0214e0, drop 0.0000e0, punt 0.0000e0Name                 State         Calls          Vectors        Suspends         Clocks       Vectors/Call
dpdk-input                       polling         232754435               0               0          1.48e2            0.00
ethernet-input                   active                 34              34               0          6.34e3            1.00
virtio-input                     polling         193182449              34               0          1.33e9            0.00

相关内容

热门资讯

最新!上海市嘉定区江桥镇人民政... 转自:上观新闻据“上海江桥”,上海市嘉定区江桥镇人民政府发布声明,具体如下:为保障本区域城市更新工作...
新亚电缆:2024年净利润1.... 中证智能财讯新亚电缆(001382)4月21日披露2024年年度报告。2024年,公司实现营业总收入...
日本一酒店140名旅客食物中毒 据央视新闻客户端消息,据日本媒体报道,日本北海道食品卫生部门19日表示,近日,位于北海道十胜地区音更...
2025定州半程马拉松盛大开赛 来源:人民网-河北频道 人民网定州4月20日电 (记者周博、实习生连亚拯)4月20日7时30分,文博...
【资本观察】蓝筹股平值可转债值... 随着年报季的深入,市场逐渐进入了一个信息密集、预期调整的关键时期。在这个阶段的下半场,投资者面临着诸...
抓获13人!兰州榆中警方严打盗... 来源:兰州公安 近期,兰州公安榆中县局以加快形成和提升新质公安战斗力为核心,以“专业+机制+大数据”...
订婚后发现女方婚史起诉退16.... 转自:JSTV荔枝视频 【#订婚后发现女方婚史起诉退16...
广州越秀区“人才专列”携125... 新京报讯(记者陈琳)4月20日,广州市“百万英才汇南粤”2025年N城联动春季招聘活动(北京站),组...
奋进的春天丨从“流量”到“增量...   从“赏花流量”到“经济增量”,天津一季度GDP同比增长5.8%,实现“开门红”。在京津冀协同发展...
上交所对ST新潮下发监管工作函... 转自:北京商报北京商报讯(记者 马换换 王蔓蕾)4月20日晚间,上交所官网显示,上交所对ST新潮(6...
短短3个月,6家险资举牌12次... 【导读】一季度险资举牌12次远高去年同期,港股上市银行备受青睐中国基金报记者 马嘉昕近日,据中国保险...
浙江经济观察:如何促进民营经济... 转自:扬子晚报网中新网杭州4月20日电(林波)今年以来,杭州“六小龙”火热出圈,在人工智能、大模型、...
万家中证半导体材料设备主题ET... 2025年第1季度,万家中证半导体材料设备主题ETF表现备受关注。本季度内,该基金在份额、净值等方面...
在百里环廊追风,八百余名骑手征... 新京报讯(记者田杰雄)4月20日,2025年“百里环廊”骑行季启动仪式暨第二届“骑行北京·百里环廊”...
用友t6怎样从工作中心界面切换... 用友t6怎样从工作中心界面切换到企业管理点开布局设置可以任意选择。
明天,查分! 2025年上半年中小学教师资格考试(笔试)结果将于明天(4月21日)上午10点公布!查询方法↓↓↓1...
天邑股份:2024年实现营业总... 中证智能财讯天邑股份(300504)4月21日披露2024年年度报告。2024年,公司实现营业总收入...
五角大楼查信息外泄 防长四名... 转自:新华社新华社北京4月20日电  美国国防部扩大对敏感或涉密信息外泄的调查,过去一周来,防长皮特...
仓位“大开大合” ,“老基金”...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会!   在重挫的交易日里...
三个月,民怨沸腾 “停止非法驱逐”“工人而非富人拥有权力”“宪法危机已经到来”……19日,白宫门前举行的抗议活动中,各...