Système: Ubuntu 14.04 Kernel 4.10.12
Je suis donc en train d'essayer de comprendre le fonctionnement de FTrace, mais quelque chose que j'ai remarqué me dérange un peu:
available_filter_functions peut être utilisé pour filtrer ce qui est tracé à certaines fonctions. Mais la fonction que je tente de tracer (dans ce cas, la fonction de travail principale de KSM, ksm_do_scan) n'apparaît pas dans la liste.
Voici la liste des fonctions disponibles (filtrées par ksm-fonctions):
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
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é cela sur un autre système installé avec la version 4.4.0-31 du noyau, et ksm_do_scan () figurait dans la liste des fonctions disponibles de filtre. J'ai donc pensé que cela devait avoir quelque chose à voir avec la configuration du noyau 4.10.12, mais je n'en suis pas sûr. Toutes les options recommandées .config 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 liste les fonctions annotées avec __init et __devinit car les fonctions du noyau init sont chargées lors de l’initialisation et supprimées une fois l’initialisation terminée, mais ksm_do_scan ne contient aucune de ces annotations.