如何在tracepoint上注册函数
register_trace_##name宏中
tracepoint_probe_register在这个函数中在同一个cp上可以挂多个处理函数,
查看函数:trace_block_rq_issue中定义了这个tracepoint以及tracepoint的钩子函数
tracepoint中给你输入了trace_block_rq_issue(q, rq);其中q是request_queue,rq是struct request,这两个东西是tracepoint提供给你的,所有的函数都能够得到,这个函数的执行的流程是啥样子的啊,钩子函数中一定是要有void函数的,各路ftrace啥的都注册了自己的函数,包括perf也是在函数中注册了自己的函数,看下ftrace注册的什么函数呢,ftrace中肯定是注册了自己的特定的函数
kernel/trace/trace_events.c中有许多的钩子函数
ftrace_enable_fops
ftrace_event_format_fops
__ftrace_event_enable_disable
使用牛逼的systemtap可以轻而易举地得到函数中的钩子是啥:call->class->reg(call, TRACE_REG_UNREGISTER, file);
得到钩子的地址是:trace_event_reg
然后钩子函数是啥子咧,发现是是函数 trace_event_raw_event_block_rq_issue
这个函数是咋生成的呢?
都是在头文件中生成的
./include/trace/events/f2fs.h
DECLARE_EVENT_CLASS在这个宏中会扩展函数trace_event_raw_event_block_rq_issue函数
以f2fs的declare_event_class函数中
122 DECLARE_EVENT_CLASS(f2fs__inode,
123
124 TP_PROTO(struct inode *inode),
125
126 TP_ARGS(inode),
127
128 TP_STRUCT__entry(
129 __field(dev_t, dev)
130 __field(ino_t, ino)
131 __field(ino_t, pino)
132 __field(umode_t, mode)
133 __field(loff_t, size)
134 __field(unsigned int, nlink)
135 __field(blkcnt_t, blocks)
136 __field(__u8, advise)
137 ),
138
139 TP_fast_assign(
140 __entry->dev = inode->i_sb->s_dev;
141 __entry->ino = inode->i_ino;
142 __entry->pino = F2FS_I(inode)->i_pino;
143 __entry->mode = inode->i_mode;
144 __entry->nlink = inode->i_nlink;
145 __entry->size = inode->i_size;
146 __entry->blocks = inode->i_blocks;
147 __entry->advise = F2FS_I(inode)->i_advise;
148 ),
149
150 TP_printk("dev = (%d,%d), ino = %lu, pino = %lu, i_mode = 0x%hx, "
151 "i_size = %lld, i_nlink = %u, i_blocks = %llu, i_advise = 0x%x",
152 show_dev_ino(__entry),
153 (unsigned long)__entry->pino,
154 __entry->mode,
155 __entry->size,
156 (unsigned int)__entry->nlink,
157 (unsigned long long)__entry->blocks,
158 (unsigned char)__entry->advise)
159 );
函数中:
./include/trace/trace_events.h
664 static notrace void \
665 trace_event_raw_event_##call(void *__data, proto) \
666 { \
667 struct trace_event_file *trace_file = __data; \
668 struct trace_event_data_offsets_##call __maybe_unused __data_offsets;\
669 struct trace_event_buffer fbuffer; \
670 struct trace_event_raw_##call *entry; \
671 int __data_size; \
672 \
673 if (trace_trigger_soft_disabled(trace_file)) \
674 return; \
675 \
676 __data_size = trace_event_get_offsets_##call(&__data_offsets, args); \
677 \
678 entry = trace_event_buffer_reserve(&fbuffer, trace_file, \
679 sizeof(*entry) + __data_size); \
680 \
681 if (!entry) \
682 return; \
683 \
684 tstruct \
685 \
686 { assign; } \
687 \
688 trace_event_buffer_commit(&fbuffer); \
689 }
按说,ftrace的printk部分
perf注册的函数是perf_trace_##call函数,include/trace/perf.h文件
如何在tracepoint上注册函数的更多相关文章
- 如何在yarn上运行Hello World(二)
在之前的一篇文章我们介绍了如何编写在yarn集群提交运行应用的AM的yarnClient端,现在我们来继续介绍如何编写在yarn集群控制应用app运行的核心模块 ApplicationMaster ...
- 如何在TVM上集成Codegen(下)
如何在TVM上集成Codegen(下) Bring DNNL to TVM: JSON Codegen/Runtime 现在实现将中继图序列化为JSON表示的DNNL codegen,然后实现DNNL ...
- 如何在TVM上集成Codegen(上)
如何在TVM上集成Codegen(上) 许多常用的深度学习内核,或者提供DNNL或TensorRT等框架和图形引擎,让用户以某种方式描述他们的模型,从而获得高性能.此外,新兴的深度学习加速器也有自己的 ...
- 关于如何在github上创建团队开发环境
今天想写个如何在github上创建团队开发环境的博客.送给那些还不知道如何在github上创建团队开发环境的开发人员. 1.首先,当然你要有个github的账号.具体怎么注册我这里就不说了.可以上gi ...
- 如何在windows7上安装启明星系统。
启明星系统提供多种安装方式.安装包里自带了setup.exe.每个程序的 install下有在线安装(例如请假应用程序为book,则默认为 http://localhost/book/install ...
- (转)如何在Windows上安装多个MySQL
原文:http://www.blogjava.net/hongjunli/archive/2009/03/01/257216.html 如何在Windows上安装多个MySQL 本文以免安装版的mys ...
- 如何在Pypi上发表自己的Python库
背景 最近兴趣使然写了几个Python库,也发布到了Pypi上,虽然没什么人下载,但自己在其他机器上用着也会很方便.这里我向大家介绍一下如何在Pypi上发表自己的Python库. 准备 注册账号 很显 ...
- 如何在Android上编写高效的Java代码
转自:http://www.ituring.com.cn/article/177180 作者/ Erik Hellman Factor10咨询公司资深移动开发顾问,曾任索尼公司Android团队首席架 ...
- 如何在Windows上挂载Linux系统分区
NFS普遍用于unix之间共享,windows默认是不支持这种文件系统的.如果我们要用windows访问NFS的话,而windows系统自身又不支持这种文件系统,那么我们该怎么办? 别急,小编这就手把 ...
随机推荐
- onblur事件和click事件冲突
在js中onblur事件的优先级click事件,所以同一个元素上绑定两个事件的时候,onblur事件会冲掉click事件. 解决方案:将click事件改成mousedown事件
- LeetCode 中级 - 路径总和2(113)
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 ...
- 小a和uim之大逃离(dp)
题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...
- php判断某个数是素数的3种方法
什么是素数? 质数又称素数.一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数:否则称为合数.(注:1不是素数.) 方法一: 基本方法,——计数方法. $num = 7; $n = ...
- Modify the apache2 default document and home page on ubuntu (ubuntu下修改apache2默认目录和默认主页)
Change the apache2 default website directory As we know, The apache2 default directory at /var/www/, ...
- 8.2 USB键盘驱动编写和测试
目标:根据USB驱动分析和上节的USB鼠标驱动,编写键盘驱动,并测试. 一.原理分析 1. 首先通过打印usb_buf[i]中的8字节数据,看一下按键按下之后会接收到什么. 1)通过按完所有键盘按键打 ...
- Python学习 :格式化输出
方式一:使用占位符 % 常用占位符:% s (s = string 字符串) % d (d = digit 整数(十进制)) % f ( f = float 浮点数) na ...
- 洛谷U32670 小凯的数字(比赛)
题目网址 https://www.luogu.org/problemnew/show/U32670 题目背景 NOIP2018 原创模拟题T1 NOIP DAY1 T1 or DAY 2 T1 难度 ...
- uva 508 - Morse Mismatches(摩斯码)
来自https://blog.csdn.net/su_cicada/article/details/80084529 习题4-6 莫尔斯电码(Morse Mismatches, ACM/ICPC Wo ...
- windows下subversion服务器搭建
一.下载subversion服务器端和客户端软件 1.subversion下载地址:http://subversion.tigris.org/ 2.svn比较流行的客户端Tortoisesvn下载地址 ...