VPP 源码学习总结

当我们在VPP/plugins目录下注册了自己的node后, 肯定有一个node.func(), 那这个函数是如何执行到的呢:

1. 首先我们要看一下这个插件注册的时候做了什么, 假设node 如下:

编译成功后, 我们可以从函数vlib_plugin_early_init() 中分析, 初始化时,怎么把这个node加到全局链表中的。

TODO: 大概就是, 在so 目录下去遍历所有so文件,根据注册的名字用头插法把相关node 加入链表中, 并为其分配相关的维护逻辑。

2. vpp初始化的前两步把插件,加载完了(维护起来了), 那下边我们看下VPP是怎么在后台一直去轮询的呢? 

由于亿图脑图目前不能保存,节点限制, 先把已经总结放这里(新标签中打开图片可以放大)。

下图主要以vpp的main()为入口,学习vpp如果调用我注册的node的处理函数的。

前边马上就要找到调用我们注册的node了, 下边我们看一下dispatch_node()函数。

在调用的地方我们要注意框起来的这两个参数:

因为我们注册的NODE是VLIB_NODE_TYPE_INTERNAL类型的, 这里就是了, 我们看下dispatch_node()源码:

static_always_inline u64
dispatch_node (vlib_main_t * vm,vlib_node_runtime_t * node,vlib_node_type_t type,     // internal 类型的vlib_node_state_t dispatch_state,   // polling 状态 的。vlib_frame_t * frame, u64 last_time_stamp)
{uword n, v;u64 t;vlib_node_main_t *nm = &vm->node_main;vlib_next_frame_t *nf;if (CLIB_DEBUG > 0){vlib_node_t *n = vlib_get_node (vm, node->node_index);ASSERT (n->type == type);}/* Only non-internal nodes may be disabled. */if (type != VLIB_NODE_TYPE_INTERNAL && node->state != dispatch_state){ASSERT (type != VLIB_NODE_TYPE_INTERNAL);return last_time_stamp;}if ((type == VLIB_NODE_TYPE_PRE_INPUT || type == VLIB_NODE_TYPE_INPUT) // 这里些时进不来&& dispatch_state != VLIB_NODE_STATE_INTERRUPT){u32 c = node->input_main_loops_per_call;/* Only call node when count reaches zero. */if (c){node->input_main_loops_per_call = c - 1;return last_time_stamp;}}/* Speculatively prefetch next frames. */if (node->n_next_nodes > 0) // 这里是预取, 先不用管{nf = vec_elt_at_index (nm->next_frames, node->next_frame_index);CLIB_PREFETCH (nf, 4 * sizeof (nf[0]), WRITE);}vm->cpu_time_last_node_dispatch = last_time_stamp;if (1 /* || vm->thread_index == node->thread_index */ ) // 这里一定能进来。{vlib_main_t *stat_vm;stat_vm = /* vlib_mains ? vlib_mains[0] : */ vm;vlib_elog_main_loop_event (vm, node->node_index, last_time_stamp,frame ? frame->n_vectors : 0,/* is_after */ 0);/** Turn this on if you run into* "bad monkey" contexts, and you want to know exactly* which nodes they've visited... See ixge.c...*/if (VLIB_BUFFER_TRACE_TRAJECTORY && frame) // 这里前宏没有定义 , 进不来{int i;u32 *from;from = vlib_frame_vector_args (frame);for (i = 0; i < frame->n_vectors; i++){vlib_buffer_t *b = vlib_get_buffer (vm, from[i]);add_trajectory_trace (b, node->node_index);}n = node->function (vm, node, frame); }else // 最后走到了这里。n = node->function (vm, node, frame);  // 这里调用的我们加的internal node的执行函数。/* 因为上层调用的时候 , 是处理所有的internal类型的node, 这里的node 就包含了我们注册的
Node.  node->function () 就是调用的我们注册的函数 yb_sample_node_fn() , 上层调用是一个
while() 循环, 所以这些node会一直在后台循环处理, 这样只要有包到我们这个node,就会添加进调度链表,并进行处理。*/

从这个流程上, 就大概知道我们注册的node是如何被调用起来的了。 以后有更多的细节要学习, 可以根据这个流程去找具体的实现逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Telegram mini app 登录小部件 | 自定义登录按钮 或 静默登录

先说我遇到的问题&#xff0c;我按照流程接入了 telegram 登录小部件&#xff0c;在 PC 或者 H5 可以拿到数据&#xff08;不管是选择回调函数还是回调地址的形式都可以&#xff09;&#xff0c;但是在 telegram mini app 中登录拿不到数据&#xff0c;在 telegram 中 我点击登…

RabbitMQ笔记(基础篇)

视频&#xff1a; MQ基础-01.RabbitMQ课程介绍_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1mN4y1Z7t9?p1&vd_sourced0ea58f1127eed138a4ba5421c577eb1 一、RabbitMQ简介 1.同步调用 优势&#xff1a;时效性强&#xff0c;等待结果后才返回 劣势&#xff1…

虚拟化与Docker基本概念与Docker的安装

Docker Docker 是一个开源的应用容器引擎&#xff0c;它最初是用 Go 语言开发的。Docker 允许开发者将应用程序及其依赖、库和环境打包到一个可移植的容器中&#xff0c;这个容器可以在任何支持 Docker 的 Linux 或 Windows 机器上运行&#xff0c;保证了应用在不同环境之间的…

【行为型模式】备忘录模式

一、备忘录模式概述 备忘录模式定义&#xff1a;又称之为快照模式(Snapshop Pattern)或者令牌模式(Token Pattern)&#xff0c;是指在不破坏封装的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态&#xff0c;这样我们就可以在需要的时候将该对…

【14-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

InstantMesh:利用稀疏视图大规模重建模型从单张图像高效生成3D网格

作者&#xff1a;Jiale Xu&#xff0c;Weihao Cheng&#xff0c;Yiming Gao等 编译&#xff1a;东岸因为一点人工一点智能 InstantMesh&#xff1a;利用稀疏视图大规模重建模型从单张图像高效生成3D网格在这项工作中&#xff0c;我们提出了InstantMesh&#xff0c;一个开源的…

【C语言】红黑树详解以及C语言模拟

一、红黑树的性质二、红黑树的旋转操作三、红黑树的插入操作四、红黑树的删除操作五、红黑树的应用六、C语言模拟红黑树七、总结 红黑树是一种自平衡二叉查找树&#xff0c;它能够保持树的平衡&#xff0c;从而确保查找、插入和删除的最坏情况时间复杂度为O( l o g n log_n log…

LoRA: 大模型的低秩适配

笔记整理&#xff1a;陈一林&#xff0c;东南大学硕士&#xff0c;研究方向为不确定知识图谱规则学习 链接&#xff1a;https://arxiv.org/abs/2106.09685 1、动机 自然语言处理的一个重要范式包括在通用领域数据上进行大规模预训练&#xff0c;然后对特定任务或领域进行适应性…

JAVA10迭代更新

文章目录 1 概述2 语法层次的变化1_局部变量的类型推断 3 API层次的变化1_集合中新增copyOf创建只读集合2_Optional 新增了orElseThrow方法 4 其他1_垃圾回收器接口2_G1 并行 Full GC3_应用程序类数据共享(扩展 CDS 功能)4_实验性的基于 Java 的 JIT 编译器 1 概述 2018年3月21…

新能源汽车小米su7

小米su7汽车 function init() {const container document.querySelector( #container );camera new THREE.PerspectiveCamera( 20, window.innerWidth / window.innerHeight, 1, 50000 );camera.position.set( 0, 700, 7000 );scene new THREE.Scene();scene.background ne…

vue项目中基于fabric 插件实现涂鸦画布功能

vue项目中基于fabric 插件实现涂鸦画布功能 一、效果图二、安装依赖三、main.js引入四、主要代码 一、效果图 二、安装依赖 npm install fabric 三、main.js引入 import fabric from fabric Vue.use(fabric);四、主要代码 //封装成了一个组件 <template><el-dialogt…

FlashSpeech、ID-Animator、TalkingGaussian、FlowMap、CutDiffusion

本文首发于公众号&#xff1a;机器感知 FlashSpeech、ID-Animator、TalkingGaussian、FlowMap、CutDiffusion Gradient Guidance for Diffusion Models: An Optimization Perspective Diffusion models have demonstrated empirical successes in various applications and ca…

《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制婴儿性别比例饼图

在MATLAB 中可以使用 pie 函数来创建饼图。饼图是一种展示不同部分占总体的相对比例的图表。 本示例从“婴儿出生数据.csv”文件读取婴儿出生数据&#xff0c;然后计算男性和女性婴儿的数量&#xff0c;使用MATLAB绘制饼图。 配套图书链接&#xff1a;https://item.jd.com…

AI图书推荐:AI驱动的图书写作工作流—从想法构思到变现

《AI驱动的图书写作工作流—从想法到变现》&#xff08;AI-Driven Book Creation: From Concept to Cash&#xff09;是Martynas Zaloga倾力打造的一本实用指南&#xff0c;它巧妙地将写作艺术与人工智能前沿技术相结合。此书不仅揭示了AI在图书出版领域的无限潜力&#xff0c;…

应用层协议 -- HTTPS 协议

目录 一、了解 HTTPS 协议 1、升级版的 HTTP 协议 2、理解“加密” 二、对称加密 1、理解对称加密 2、对称加密存在的问题 三、非对称加密 1、理解非对称加密 2、中间人攻击 3、CA 证书和数字签名 四、总结 一、了解 HTTPS 协议 1、升级版的 HTTP 协议 HTTPS 也是…

fatal: unable to access ‘https://github.com/alibaba/flutter_boost.git/

Git error. Command: git fetch stdout: stderr: fatal: unable to access ‘https://github.com/alibaba/flutter_boost.git/’: Failed to connect to github.com port 443 after 75005 ms: Couldn’t connect to server exit code: 128 GitHub (国际型)代码 分发平台/托管平…

Mycat(一)入门概述

文章目录 概述作用原理 Mycat1.x 与 Mycat2 功能对比1.x 与 2.0 功能对比图 Mycat2 相关概念概念描述 配置文件1、服务&#xff08;server&#xff09;2、用户&#xff08;user&#xff09;3、数据源&#xff08;datasource&#xff09;4、集群&#xff08;cluster&#xff09;…

车企的数智化“内功”,大模型帮修炼

文&#xff5c;白 鸽 编&#xff5c;王一粟 时隔4年回归的北京车展&#xff0c;遇上了中国智能汽车的热潮。 开年价格战的持续洗礼&#xff0c;不仅让一众中国车企都慌得一批&#xff0c;也让全球巨头特斯拉也面临一季度销量大跌局面。 与此同时&#xff0c;智能汽车还在…

C++初识内存管理和模版

目录 前言 1.C/C内存分布 2. C的内存管理方式 2.1 new/delete操作内置类型 2. new和delete操作自定义类型 3. operator new和operator delete函数 4. new和delete的实现原理 4.1 内置类型 4.2 自定义类型 5. malloc/free和new/delete的区别 6. 初识模版 6.1 泛型编…

ERROR: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

今天本来想在A服务器上传文件给B服务器的结果发现明明给root用户设置了密码就是远程登陆不了&#xff0c;后来才发现在容器中很多服务都是没有的&#xff0c;所以刚安装后忘记了修改配置文件&#xff0c;导致远程登陆失败。 报错&#xff1a; 解决方法&#xff1a; 在/etc/ssh…