FTrace: Como o available_filter_functions é decidido?

1

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.

    
por MangoOfFury 28.04.2017 / 02:25

1 resposta

1

Direto da boca do cavalo (do irc chat com Steven Rostedt)

"são todas funções que são listadas em branco e não estão embutidas ou marcadas como" notrace ". Agora, na minha próxima versão, as funções init poderão ser rastreadas na inicialização, mas não nas funções init do módulo ainda"

Para responder à sua pergunta: O gcc pode inline qualquer função estática que é usada em um único lugar, independentemente do tamanho. Então, tente adicionar "noinline" nessa função.

Isso funcionou para mim.

    
por 29.04.2017 / 03:42