系统:Ubuntu 14.04 内核 4.10.12
因此,我正在尝试了解 FTrace 的工作原理,但我注意到有些事情让我有点偏离轨道:
available_filter_functions 可用于过滤要跟踪的某些函数。但我尝试跟踪的函数(在本例中为 KSM 的主要工作函数 ksm_do_scan)未显示在列表中。
以下是可用功能的列表(通过 ksm-functions 过滤):
root@test:/sys/kernel/debug/tracing# cat available_filter_functions | grep
ksm
ksm_memory_callback
break_ksm
unmerge_ksm_pages
get_ksm_page
try_to_merge_with_ksm_page
ksm_scan_thread (calls ksm_do_scan)
__ksm_enter
ksm_madvise
__ksm_exit
ksm_might_need_to_copy
rmap_walk_ksm
ksm_migrate_page
ksm_do_scan 如下所示:
static void ksm_do_scan(unsigned int scan_npages)
{
struct rmap_item *rmap_item;
struct page *uninitialized_var(page);
while (scan_npages-- && likely(!freezing(current))) {
cond_resched();
rmap_item = scan_get_next_rmap_item(&page);
if (!rmap_item)
return;
cmp_and_merge_page(page, rmap_item);
put_page(page);
}
}
我在另一个安装了内核版本 4.4.0-31 的系统上测试了这一点,ksm_do_scan() 出现在 available_filter_functions 列表中。因此,我认为这一定与 4.10.12 内核的配置方式有关,但我不确定。到目前为止,我看到的所有推荐的 .config 选项都已启用:
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
CONFIG_STACK_TRACER=y
CONFIG_DYNAMIC_FTRACE=y
最后,我知道 ftrace 将带有 __init 和 __devinit 注释的函数列入黑名单,因为内核初始化函数在初始化期间加载,并在初始化完成时删除,但 ksm_do_scan 不包含这两个注释。
答案1
直接来自当事人的消息(来自与 Steven Rostedt 的 irc 聊天)
“它们都是白名单函数,没有内联或标记为“notrace”。现在在我的下一个版本中,init 函数将能够在启动时被跟踪,但模块 init 函数还不能被跟踪”
回答你的问题:gcc 可能会内联在单个位置使用的任何静态函数,无论其大小如何。因此,请尝试在该函数中添加“noinline”。
这对我有用。