1

Система: Ubuntu 14.04 Kernel 4.10.12

Итак, я пытаюсь понять, как работает FTrace, но кое-что, что я заметил, немного меня срывает:

available_filter_functions можно использовать для фильтрации того, что отслеживается в определенных функциях. Но функция, которую я пытаюсь отследить (в данном случае основная рабочая функция KSM ksm_do_scan) не отображается в списке.

Вот список доступных функций (отфильтрованных по ksm-функциям):

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

А вот как выглядит 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);
    }
}

Я проверил это на другой системе, которая была настроена с версией ядра 4.4.0-31, и ksm_do_scan() появилась в списке available_filter_functions. Поэтому я подумал, что это как-то связано с настройкой ядра 4.10.12, но я не уверен. Все рекомендуемые параметры .config, которые я видел до сих пор, включены:

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

Наконец, я знаю, что функции черного списка ftrace снабжены комментариями __init и __devinit, поскольку функции инициализации ядра загружаются во время инициализации и удаляются по завершении инициализации, но ksm_do_scan не содержит ни одной из этих аннотаций.

1 ответ1

1

Прямо изо рта лошади (из irc-чата со Стивеном Ростедтом)

«Это все функции, которые занесены в белый список и не являются встроенными или не помечены как" notrace ". Теперь в моем следующем выпуске функции инициализации будут отслеживаться при загрузке, но пока нет функций инициализации модуля»

Чтобы ответить на ваш вопрос: gcc может встроить любую статическую функцию, которая используется в одном месте, независимо от размера. Поэтому попробуйте добавить "noinline" в эту функцию.

Это сработало для меня.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .