FTrace:可用的过滤函数是如何决定的?

FTrace:可用的过滤函数是如何决定的?

系统: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”。

这对我有用。

相关内容