FTrace: available_filter_function işlevlerine nasıl karar verilir?


1

Sistem: Ubuntu 14.04 Çekirdek 4.10.12

Bu yüzden FTrace'in nasıl çalıştığını anlamaya çalışıyorum, ama fark ettiğim bir şey beni biraz mahvediyor:

available_filter_functions, belirli işlevlerde izlenenleri filtrelemek için kullanılabilir. Ancak izlemeye çalıştığım işlev (bu durumda, KSM'nin ana çalışan işlevi ksm_do_scan) listede görünmüyor.

Kullanılabilir işlevlerin listesi (ksm işlevleriyle filtrelenmiştir):

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

Ve işte ksm_do_scan neye benziyor:

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);
    }
}

Bunu Çekirdek sürümü 4.4.0-31 ile ayarlanmış başka bir sistemde test ettim ve ksm_do_scan (), available_filter_functions listesinde göründü. Bu yüzden 4.10.12 Çekirdeğinin nasıl yapılandırıldığına dair bir şeyler yapması gerektiğini düşündüm, ama emin değilim. Şimdiye kadar gördüğüm önerilen .config seçeneklerinin tümü etkindir:

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

Son olarak, ftrace kara listesinin __init ve __devinit ile açıklamalı olan fonksiyonları listelediğini biliyorum çünkü çekirdek başlatma işlevleri başlatma sırasında yüklenir ve başlatma yapıldığında kaldırılır, ancak ksm_do_scan bu ek açıklamalardan hiçbirini içermez.

Yanıtlar:


1

Doğrudan atın ağzından (Steven Rostedt ile irc sohbetinden)

"hepsi beyaz olarak listelenen ve sıralanmamış veya" notrace "işaretli olmayan işlevlerdir. şimdi bir sonraki sürümümde, init işlevleri açılışta izlenebilecek ancak henüz modül init işlevleri bulunamayacak."

Sorunuzu cevaplamak için: gcc, boyutuna bakmaksızın tek bir yerde kullanılan herhangi bir statik işlevi satır içi olabilir. Bu fonksiyona "noinline" eklemeyi deneyin.

Bu benim için çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.