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. js实现图片点击弹出放大效果

    点击图片,显示蒙板,放大图片的简单案例 HTML代码: <div> <img height=" src="https://img-blog.csdn.net/20 ...

  2. 【前行&赛时总结】◇第4站&赛时9◇ CF Round 513 Div1+Div2

    ◇第4站&赛时9◇ CF Round 513 Div1+Div2 第一次在CF里涨Rating QWQ 深感不易……作blog以记之 ( ̄▽ ̄)" +Codeforces 的门为你打 ...

  3. EF core Code First 简单的使用方法

    好吧,我又回来了,其实一直都想写一篇关于EF core 的文章去记录自己在开发时候遇到的问题. 为什么要使用EF框架呢,因为原始的ADO.NET需要编写大量的数据访问代码,所以使用EF会更方便.但是今 ...

  4. struts2入门第一天----------一个简单例

    搭建完环境后就可以动手去打代码了.首先创建一个简单的提交表单的jsp页面(html页面也可以), <%@ page language="java" import=" ...

  5. javascript中几种this指向问题

    javascript中几种this指向问题   首先必须要说的是,this 永远指向函数运行时所在的对象,而不是函数被创建时所在的对象. (1).作为函数名调用   函数作为全局对象调用,this指向 ...

  6. Apache Maven(三):POM

    什么是 POM? POM (Project Object Model) 项目对象模型.它是一个XML文件,其中包含有关Maven用于构建项目的项目和配置细节的信息.它包含大多数项目的默认值.例如,构建 ...

  7. Mysqldump自定义导出n条记录

    很多时候DBA需要导出部分记录至开发.测试环境,因数据量需求较小,如果原库的记录多,且表数量也多,在用mysqldump命令导出时可以添加一个where参数,自定义导出n条记录,而不必全量导出. 示例 ...

  8. Spark-源码-Spark-Submit 任务提交

    Spark 版本:1.3 调用shell, spark-submit.sh args[] 首先是进入 org.apache.spark.deploy.SparkSubmit 类中调用他的 main() ...

  9. 笨方法学python之import sys与from sys import argv的区别

    这是在网上看到的一个大神的解答: sys is a module that contains “system functionality”. sys.argv is a list containing ...

  10. POJ2739 Sum of Consecutive Prime Numbers 确定某个数以内的所有素数

    参考:https://www.cnblogs.com/baozou/articles/4481191.html #include <iostream> #include <cstdi ...