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.