Système: Ubuntu 14.04 Kernel 4.10.12
Je suis en train d'essayer de comprendre comment fonctionne FTrace, mais quelque chose que j'ai remarqué me déroute un peu:
available_filter_functions peut être utilisé pour filtrer ce qui est tracé vers certaines fonctions. Mais la fonction que j'essaie de tracer (dans ce cas, la fonction principale de travail de KSM ksm_do_scan) n'apparaît pas dans la liste.
Voici la liste des fonctions disponibles (filtrées par 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 (appels ksm_do_scan)
__ksm_enter
ksm_madvise
__ksm_exit
ksm_might_need_to_copy
rmap_walk_ksm
ksm_migrate_page
Et voici à quoi ressemble 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);
}
}
J'ai testé ceci sur un autre système qui avait été configuré avec la version du noyau 4.4.0-31, et ksm_do_scan() apparaissait dans la liste des available_filter_functions. J'ai donc pensé que cela devait avoir quelque chose à voir avec la façon dont le noyau 4.10.12 était configuré, mais je ne suis pas sûr. Toutes les options .config recommandées que j'ai vues jusqu'à présent sont activées:
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
CONFIG_STACK_TRACER=y
CONFIG_DYNAMIC_FTRACE=y
Enfin, je sais que ftrace met sur liste noire les fonctions qui sont annotées avec __init et __devinit car les fonctions d'initialisation du noyau sont chargées pendant l'initialisation et supprimées une fois l'initialisation terminée, mais ksm_do_scan ne contient aucune de ces annotations.