1 votes

FTrace: Comment les fonctions de filtre disponibles sont-elles décidées ?

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.

2voto

alex Points 136

Tout droit de la bouche du cheval (de la discussion en chat IRC avec Steven Rostedt)

"Ce sont toutes des fonctions qui sont autorisées et ne sont pas en ligne ou marquées comme "notrace". Maintenant, dans ma prochaine version, les fonctions d'initialisation pourront être tracées au démarrage mais pas encore les fonctions d'initialisation de modules."

Pour répondre à votre question : gcc peut mettre en ligne n'importe quelle fonction statique utilisée à un seul endroit, peu importe sa taille. Essayez donc d'ajouter "noinline" dans cette fonction.

Cela a fonctionné pour moi.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X