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上注册函数的更多相关文章

  1. 如何在yarn上运行Hello World(二)

      在之前的一篇文章我们介绍了如何编写在yarn集群提交运行应用的AM的yarnClient端,现在我们来继续介绍如何编写在yarn集群控制应用app运行的核心模块 ApplicationMaster ...

  2. 如何在TVM上集成Codegen(下)

    如何在TVM上集成Codegen(下) Bring DNNL to TVM: JSON Codegen/Runtime 现在实现将中继图序列化为JSON表示的DNNL codegen,然后实现DNNL ...

  3. 如何在TVM上集成Codegen(上)

    如何在TVM上集成Codegen(上) 许多常用的深度学习内核,或者提供DNNL或TensorRT等框架和图形引擎,让用户以某种方式描述他们的模型,从而获得高性能.此外,新兴的深度学习加速器也有自己的 ...

  4. 关于如何在github上创建团队开发环境

    今天想写个如何在github上创建团队开发环境的博客.送给那些还不知道如何在github上创建团队开发环境的开发人员. 1.首先,当然你要有个github的账号.具体怎么注册我这里就不说了.可以上gi ...

  5. 如何在windows7上安装启明星系统。

    启明星系统提供多种安装方式.安装包里自带了setup.exe.每个程序的 install下有在线安装(例如请假应用程序为book,则默认为 http://localhost/book/install ...

  6. (转)如何在Windows上安装多个MySQL

    原文:http://www.blogjava.net/hongjunli/archive/2009/03/01/257216.html 如何在Windows上安装多个MySQL 本文以免安装版的mys ...

  7. 如何在Pypi上发表自己的Python库

    背景 最近兴趣使然写了几个Python库,也发布到了Pypi上,虽然没什么人下载,但自己在其他机器上用着也会很方便.这里我向大家介绍一下如何在Pypi上发表自己的Python库. 准备 注册账号 很显 ...

  8. 如何在Android上编写高效的Java代码

    转自:http://www.ituring.com.cn/article/177180 作者/ Erik Hellman Factor10咨询公司资深移动开发顾问,曾任索尼公司Android团队首席架 ...

  9. 如何在Windows上挂载Linux系统分区

    NFS普遍用于unix之间共享,windows默认是不支持这种文件系统的.如果我们要用windows访问NFS的话,而windows系统自身又不支持这种文件系统,那么我们该怎么办? 别急,小编这就手把 ...

随机推荐

  1. LeetCode 中级 - 翻转矩阵后的得分(861)

    有一个二维矩阵 A 其中每个元素的值为 0 或 1 . 移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0. 在做出任意次数的移动后,将该矩阵的每一 ...

  2. 数论(一)LOJ1282

    1.题目来源LOJ1282 You are given two integers: n and k, your task is to find the most significant three d ...

  3. mybatis笔记之一次插入多条数据sql语句写法

    <insert id="insertList" parameterType="java.util.List"> insert into balanc ...

  4. 【原创】从 列表的重复 到 用sum展开二层嵌套列表将子元素合并

      转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9517159.html     ★像R语言里头有rep函数可以让向量的值重复,在python里面可以直 ...

  5. 阿里云SSL证书到期(续期)图文教程

    今天公司项目突然报错 后来查询是SSL证书过期了.友情提示: 证书产品仅支持新签发.不支持续费.证书到期前需在阿里云SSL证书控制台重新购买和申请证书. 登录阿里云控制台,点击产品与服务,在搜索框搜索 ...

  6. Python核心框架tornado的异步协程的2种方式

    什么是异步? 含义 :双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位 现象:没有共同的时钟,不考虑顺序来了 ...

  7. 【bind服务简单发布及优化部署】

    主DNS 1:安装bind服务包 2:vim  /etc/named.conf区域解析控制文件 3:vim /etc/named.rfc1912.zones解析方向文件 4:vim var/named ...

  8. layUI 下拉框遮挡

    原项目中把layui内置的富文本编辑器替换成了百度的ueditor,但是出现了一点问题,下拉框被遮挡了! 在网上查询了一些方法,发现最简单的方法就是在当前页面的<head>标签中加入 &l ...

  9. APSchedule的练习使用

    1 简介 APScheduler的全称是Advanced Python Scheduler.它是一个轻量级的 Python 定时任务调度框架.APScheduler 支持三种调度任务:固定时间间隔,固 ...

  10. 用C#实现WEB代理服务器

    用C#实现Web代理服务器 代理服务程序是一种广泛使用的网络应用程序.代理程序的种类非常多,根据协议不同可以分成HTTP代理服务程序.FTP代理服务程序等,而运行代理服务程序的服务器也就相应称为HTT ...