1

系统: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 版本相同的代码)。所以我认为它必须与 4.10.12 内核的配置方式有关,但我不确定。到目前为止,我看到的所有推荐的 .config 选项都已启用:

CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
CONFIG_STACK_TRACER=y
CONFIG_DYNAMIC_FTRACE=y

最后,我知道 ftrace 将使用 __init 和 __devinit 注释的函数列入黑名单,因为内核 init 函数在初始化期间加载并在初始化完成时删除,但 ksm_do_scan 不包含这些注释中的任何一个。

是否有一种特定的方法来编写函数,以便 ftrace 将它们识别为 available_filter_functions (我是内核版本特定的)?

4

0 回答 0