FTrace: Comment les fonctions available_filter_filter sont-elles décidées?

1

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.

MangoOfFury
la source

Réponses:

1

Tout droit sorti de la bouche du cheval

"Ce sont toutes des fonctions qui figurent sur la liste blanche et qui ne sont pas marquées" notrace ". Maintenant, dans ma prochaine version, les fonctions init pourront être suivies au démarrage mais pas encore les fonctions init du module"

Pour répondre à ta question: gcc peut intégrer toute fonction statique utilisée dans un seul endroit, quelle que soit sa taille. Alors essayez d'ajouter "noinline" dans cette fonction.

Cela a fonctionné pour moi.

alex
la source