2013年7月22日 星期一

[Linux] 使用Linux kernel的 tracepoint (trace_f2fs_iget)

今天繼續在trace f2fs source code GC的部分,參考j2ffs的文件中看到j2ffs 做GC時會call linux kernel的 iget(),就想到那 f2fs呢? 查詢後找到,f2fs_iget() -- trace_f2fs_iget() 一堆在/include/trace/events/裡面的東東。
DECLARE_EVENT_CLASS()、DEFINE_EVENT()、TRACE_EVENT()、TRACE_EVENT_CONDITION()於是開始了這篇紀錄....

在Ref[1]中提到,
Ø  追蹤點的目的
代码中的追踪点提供了在运行时调用探测函数的钩子。追踪点可以打开(已连接探测函数)或关闭(没有连接探测函数)。处于关闭状态的追踪点不会引发任何效果,除了增加了一点时间开销(检查一条分支语句的条件)和空间开销(在instrumented function[不知道如何翻译合适]的尾部增加几条函数调用的代码,在独立区域增加一个数据结构)。如果一个追踪点被打开,那么每次追踪点被执行时都会调用连接的探测函数,而且在调用者的执行上下文中。探测函数执行结束后,将返回到调用者(从追踪点继续执行)。
可以在代码中的重要位置安放追踪点。它们是轻量级的钩子函数,能够传递任意个数的参数,原型可以在定义追踪点的头文件中找到。
追蹤點可以用來進行系統追蹤並進行性能統計

在Ref[2]中提到,
2.3 钩子函数的执行
在要抓trace的地方,添加trace_##name,这样便可以调用我们注册的钩子函数。

因此知道trace_f2fs_iget()是要做啥了。

DEFINE_EVENT(f2fs__inode, f2fs_iget,

TP_PROTO(struct inode *inode),

TP_ARGS(inode)
);

#define TP_PROTO(args...) args
#define TP_ARGS(args...) args


Refs:
[1] http://blog.csdn.net/arethe/article/details/6293505
[2] http://blog.csdn.net/u011013137/article/details/9093823

沒有留言:

張貼留言