FTrace: ¿Cómo se deciden las funciones_filtro_disponibles?

1

Sistema: Ubuntu 14.04 Kernel 4.10.12

Así que estoy en el proceso de tratar de entender cómo funciona FTrace, pero algo que noté me está descarrilando un poco:

available_filter_functions se puede usar para filtrar lo que se rastrea a ciertas funciones. Pero la función que estoy tratando de rastrear (en este caso, la función de trabajo principal de KSM ksm_do_scan) no aparece en la lista.

Aquí está la lista de funciones disponibles (filtrada 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

Y así es como se ve 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);
    }
}

Probé esto en otro sistema que se había configurado con Kernel versión 4.4.0-31, y ksm_do_scan () apareció en la lista de funciones_filtro_disponibles. Así que pensé que debía tener algo que ver con la configuración del kernel 4.10.12, pero no estoy seguro. Todas las opciones recomendadas .config que he visto hasta ahora están habilitadas:

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

Finalmente, sé que ftrace enumera las funciones negras que están anotadas con __init y __devinit porque las funciones de inicio del núcleo se cargan durante la inicialización y se eliminan cuando se realiza la inicialización, pero ksm_do_scan no contiene ninguna de esas anotaciones.

MangoOfFury
fuente

Respuestas:

1

Directamente de la boca del caballo (del chat de irc con Steven Rostedt)

"son todas las funciones que están en la lista blanca y no están en línea o marcadas como" notrace ". Ahora, en mi próxima versión, las funciones init podrán rastrearse en el arranque pero aún no las funciones init del módulo".

Para responder a su pregunta: gcc puede incluir cualquier función estática que se use en un solo lugar, independientemente del tamaño. Así que intente agregar "noinline" en esa función.

Esto funcionó para mí.

alex
fuente