FTrace: Bagaimana keputusan available_filter_functions diputuskan?

1

Sistem: Ubuntu 14.04 Kernel 4.10.12

Jadi saya sedang dalam proses mencoba memahami cara kerja FTrace, tetapi sesuatu yang saya perhatikan sedikit mengganggu saya:

available_filter_functions dapat digunakan untuk memfilter apa yang dilacak ke fungsi tertentu. Tetapi fungsi yang saya coba lacak (dalam hal ini, fungsi pekerja utama KSM ksm_do_scan) tidak muncul dalam daftar.

Berikut adalah daftar fungsi yang tersedia (difilter berdasarkan fungsi 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

Dan inilah yang tampak seperti 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);
    }
}

Saya menguji ini pada sistem lain yang telah diatur dengan Kernel versi 4.4.0-31, dan ksm_do_scan () muncul di daftar fungsi available_filter_functions. Jadi saya pikir itu pasti ada hubungannya dengan bagaimana The 4.10.12 Kernel dikonfigurasi, tapi saya tidak yakin. Semua opsi .config yang direkomendasikan yang telah saya lihat sejauh ini diaktifkan:

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

Akhirnya, saya tahu bahwa ftrace daftar hitam fungsi yang dijelaskan dengan __init dan __devinit karena fungsi kernel init dimuat selama inisialisasi dan dihapus ketika inisialisasi dilakukan, tetapi ksm_do_scan tidak mengandung salah satu dari anotasi tersebut.

MangoOfFury
sumber

Jawaban:

1

Langsung dari mulut kuda (dari irc chat dengan Steven Rostedt)

"mereka semua adalah fungsi yang terdaftar putih dan tidak diuraikan atau ditandai" notrace ". sekarang dalam rilis saya berikutnya, fungsi init akan dapat dilacak pada saat boot up tetapi belum fungsi modul init"

Untuk menjawab pertanyaan Anda: gcc dapat menampilkan fungsi statis apa pun yang digunakan di satu tempat, berapapun ukurannya. Jadi coba tambahkan "noinline" di fungsi itu.

Ini berhasil untuk saya.

alex
sumber