如何编写函数以便它们可用于ftrace?

时间:2017-04-28 02:03:18

标签: linux linux-kernel kernel ftrace

系统:Ubuntu 14.04内核4.10.12

所以我正在尝试理解如何使用ftrace,但我注意到的一些事情让我有点脱轨:

available_filter_functions可用于过滤跟踪某些功能的内容。但我试图追踪的功能(在这种情况下,KSM的主要工作人员功能ksm_do_scan)没有显示在列表中。

以下是可用功能列表(按ksm功能过滤):

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

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

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

0 个答案:

没有答案