Sistema: Kernel do Ubuntu 14.04 4.10.12
Então, estou no processo de tentar entender como o FTrace funciona, mas algo que notei está me atrapalhando um pouco:
available_filter_functions pode ser usado para filtrar o que está sendo rastreado para certas funções. Mas a função que estou tentando rastrear (neste caso, a principal função de trabalho do KSM ksm_do_scan) não está aparecendo na lista.
Aqui está a lista de funções disponíveis (filtradas por 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
E aqui está o que o ksm_do_scan se parece:
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);
}
}
Eu testei isso em outro sistema que tinha sido configurado com o Kernel versão 4.4.0-31, e o ksm_do_scan () apareceu na lista de available_filter_functions. Então eu imaginei que deve ter algo a ver com a forma como o kernel 4.10.12 foi configurado, mas não tenho certeza. Todas as opções recomendadas de .config que vi até agora estão ativadas:
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
CONFIG_STACK_TRACER=y
CONFIG_DYNAMIC_FTRACE=y
Finalmente, eu sei que o ftrace black lista funções que são anotadas com __init e __devinit porque as funções init do kernel são carregadas durante a inicialização e removidas quando a inicialização é feita, mas ksm_do_scan não contém nenhuma dessas anotações.