当前位置: 首页 > news >正文

virtio设备input节点

注册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

相关文章:

virtio设备input节点

注册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_SUPP…...

《计算机网络:自顶向下方法》学习笔记——第一章:计算机网络和因特网

计网 第一章 计算机网络和因特网 1.1 什么是因特网 回答这个问题有两种方式 其一,我们能够描述因特网的具体构成,即构成因特网的基本硬件和软件组件;其二,我们能够根据为分布式应用提供服务的联网基础设施来描述因特网。 1.1.…...

PDF 解析格式化输出 API 数据接口

PDF 解析格式化输出 API 数据接口 支持输出 TEXT HTML XML TAG,多种格式输出,超精准识别率。 1. 产品功能 通用的识别接口, 支持标准 PDF 文件解析;多种格式输出,支持 TEXT HTML XML TAG;HTML 包含完美排…...

RL笔记:基于策略迭代求CliffWaking-v0最优解(python实现)

目录 1. 概要 2. 实现 3. 运行结果 1. 概要 CliffWalking-v0是gym库中的一个例子[1],是从Sutton-RLbook-2020的Example6.6改编而来。不过本文不是关于gym中的CliffWalking-v0如何玩的,而是关于基于策略迭代求该问题最优解的实现例。 CliffWalking-v0的…...

350. 两个数组的交集 II

两个数组的交集 II 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结…...

Android仿微信选择图片

效果展示首先先添加用到的权限<uses-permission android:name"android.permission.INTERNET" /><!--获取手机存储卡权限--><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:nam…...

python+嵌入式——串口通信篇(收发解包)

目录前言安装pyserialpyserial大致概括整体流程硬件连接例子(简单版)详细使用serial初始化参数发包收包收包检查包并解包python struct模块结语前言 这几年&#xff0c;自己也做了一些嵌入式机器人。在整个开发的过程中&#xff0c;调通信通常会花费一段比较长的时间&#xff…...

剖析G1 垃圾回收器

简单回顾 在Java当中&#xff0c;程序员在编写代码的时候只需要创建对象&#xff0c;从来不需要考虑将对象进行释放&#xff0c;这是因为Java中对象的垃圾回收全部由JVM替你完成了(所有的岁月静好都不过是有人替你负重前行)。 而JVM的垃圾回收由垃圾回收器来负责&#xff0c;在…...

如何打造一款专属于自己的高逼格电脑桌面

作为一名电脑重度使用者&#xff0c;你是否拥有一款属于你自己的高逼格电脑桌面呢&#xff1f;你是不是也像大多数同学一样&#xff0c;会把所有的内容全部都堆积到电脑桌面&#xff0c;不仅找东西困难&#xff0c;由于桌面内容太多还会导致C盘空间不足&#xff0c;影响电脑的反…...

【C++】string的使用及其模拟实现

文章目录1. STL的介绍1.1 STL的六大组件1.2 STL的版本1.3 STL的缺陷2. string的使用2.1 为什么要学习string类&#xff1f;2.2 常见构造2.3 Iterator迭代器2.4 Capacity2.5 Modifiers2.6 String operations3. string的模拟实现3.1 构造函数3.2 拷贝构造函数3.3 赋值运算符重载和…...

怀念在青鸟的日子

时间过的可真快&#xff0c;一转眼来到了2023年&#xff01;我初中上完就没有在念&#xff0c;下了学门步入社会&#xff0c;那时的我一片迷茫&#xff0c;不知道该去干什 么&#xff0c;父母说要不去学挖掘机、理发、修车...我思考再三&#xff0c;一个都没有我喜欢的&#xf…...

学习记录---Python内置类型

文章目录字符串split()列表常见操作列表相减字典创建普通创建eval(s)添加或更新元素d[t] 1d.update({c: 3}){**d1, **d2} **字典解包装运算符删除元素 d.pop(c)属性d.items()d.keys()d.values()访问元素d[Name]d.get(score)遍历字典for key in dictfor key, values in dict.it…...

Python笔记 -- 列表

文章目录1、列表简介2、修改、添加、删除元素2.1、添加2.2、删除3、排序、倒序4、遍历列表5、创建数值列表6、列表切片7、列表复制8、元组1、列表简介 在Python中用方括号[]表示列表&#xff0c;用逗号隔开表示其元素 通过索引访问列表 names [aa,bb,cc,dd]print(names[0]) …...

谈谈UVM中的uvm_info打印

uvm_info宏的定义如下&#xff1a; define uvm_info(ID,MSG,VERBOSITY) \begin \if (uvm_report_enabled(VERBOSITY,UVM_INFO,ID)) \uvm_report_info (ID, MSG, VERBOSITY, uvm_file, uvm_line); \end 从这里可以看出uvm_info由两部分组成&#xff1a;uvm_report_enabled(VER…...

矩阵理论1 集合上的等价关系(equivalence relations on a set S)

定义 对于一个集合S, 如果集合E⊂SS\mathcal{E} \subset S\times SE⊂SS满足以下条件 自反性: 对于∀s∈S,都有(s,s)∈E\forall s\in S, 都有 (s, s) \in \mathcal{E}∀s∈S,都有(s,s)∈E对称性: (s,t)∈E⇔(t,s)∈E(s,t) \in \mathcal{E} \Leftrightarrow (t,s)\in \mathcal…...

【网络监控】Zabbix详细安装部署(最全)

文章目录Zabbix详细安装部署环境准备安装依赖组件访问初始化配置Zabbix详细安装部署 Zabbix 是一个高度集成的网络监控解决方案&#xff0c;可以提供企业级的开源分布式监控解决方案&#xff0c;由一个国外的团队持续维护更新&#xff0c;软件可以自由下载使用&#xff0c;运作…...

阿里云轻量服务器--Docker--Nacos安装(使用外部Mysql数据存储)

前言&#xff1a;docker 安装nacos 如果不设置外部的mysql 默认使用内嵌的内嵌derby为数据源&#xff0c;这个时候如果&#xff0c;重新部署nacos 则会造成原有数据丢失情况&#xff1b; 1 默认安装的nacos 启动后使用的是内嵌的存储&#xff1a; 2 使用外部mysql 作为存储&a…...

unity开发知识点小结01

unity对象生命周期函数 Awake():最早调用&#xff0c;所以可以实现单例模式 OnEnable&#xff08;&#xff09;&#xff1a;组件激活后调用&#xff0c;在Awake后调用一次 Stat&#xff08;&#xff09;&#xff1a;在Update&#xff08;&#xff09;之前&#xff0c;OnEnable…...

软件系统[软件工程]

What’s the link? They all involve outdated (legacy) software technology. All have had huge socio-economical impact. Prompting national lockdowns. Spreadsheet workflow error led to thousands of preventable infections and deaths. Huge losses of citizen dat…...

电力系统稳定性的定义与分类

1电力系统稳定性的定义与分类 IEEE给出电力系统稳定性定义&#xff1a;电力系统稳定性是指电力系统这样的一种能力—对于给定的初始运行状态&#xff0c;经历物理扰动后&#xff0c;系统能够重新获得运行平衡点的状态&#xff0c;同时绝大多数系统变量有界&#xff0c;因此整个…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...