Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

The following are demonstrations of the hotkernel DTrace program.


Here hotkernel is run for a couple of seconds then Ctrl-C is hit,

   # ./hotkernel
   Sampling... Hit Ctrl-C to end.
   ^C
   FUNCTION                                                COUNT   PCNT
   unix`swtch                                                  1   0.1%
   pcplusmp`apic_redistribute_compute                          1   0.1%
   genunix`strrput                                             1   0.1%
   unix`sys_call                                               1   0.1%
   genunix`fsflush_do_pages                                    1   0.1%
   TS`ts_wakeup                                                1   0.1%
   genunix`callout_schedule_1                                  1   0.1%
   unix`page_create_putback                                    1   0.1%
   unix`mutex_enter                                            4   0.3%
   unix`cpu_halt                                            1575  99.2%

The output summarises which kernel-level function was sampled on the
CPU the most. This report shows that unix`cpu_halt was sampled 1575 
times, which was 99.2% of the kernel-level samples.

As it turns out, unix`cpu_halt is called on this x86 server as part of the
kernel idle thread - explaining why it is so often found on the CPU,

   # dtrace -n 'fbt::cpu_halt:entry { @[stack()] = count(); }'
   dtrace: description 'fbt::cpu_halt:entry ' matched 1 probe
   ^C
   
                 unix`idle+0x3b
                 unix`thread_start+0x3
                 956

This kernel stack trace indicates that cpu_halt() is called by idle().

The following is a SPARC example,

   # ./hotkernel 
   Sampling... Hit Ctrl-C to end.
   ^C
   FUNCTION                                                COUNT   PCNT
   genunix`fop_ioctl                                           1   0.1%
   genunix`allocb_cred                                         1   0.1%
   genunix`poll_common                                         1   0.1%
   genunix`cv_block                                            1   0.1%
   genunix`strioctl                                            1   0.1%
   genunix`disp_lock_exit                                      1   0.1%
   genunix`crfree                                              1   0.1%
   ufs`ufs_getpage                                             1   0.1%
   SUNW,UltraSPARC-IIi`copyin                                  1   0.1%
   genunix`strmakedata                                         1   0.1%
   genunix`cv_waituntil_sig                                    1   0.1%
   SUNW,UltraSPARC-IIi`prefetch_page_r                         1   0.1%
   unix`set_freemem                                            1   0.1%
   unix`page_trylock                                           1   0.1%
   genunix`anon_get_ptr                                        1   0.1%
   unix`page_hashin                                            1   0.1%
   genunix`bt_getlowbit                                        1   0.1%
   unix`pp_load_tlb                                            1   0.1%
   unix`_resume_from_idle                                      1   0.1%
   unix`hat_pageunload                                         1   0.1%
   genunix`strrput                                             1   0.1%
   genunix`strpoll                                             1   0.1%
   unix`page_do_hashin                                         1   0.1%
   unix`cpu_vm_stats_ks_update                                 1   0.1%
   genunix`sleepq_wakeone_chan                                 1   0.1%
   unix`lock_set_spl                                           1   0.1%
   tl`tl_wput                                                  1   0.1%
   genunix`kstrgetmsg                                          1   0.1%
   genunix`qbackenable                                         1   0.1%
   genunix`releasef                                            1   0.1%
   genunix`callout_execute                                     1   0.1%
   uata`ata_hba_start                                          1   0.1%
   genunix`pcacheset_cmp                                       1   0.1%
   genunix`sleepq_insert                                       1   0.1%
   genunix`syscall_mstate                                      1   0.1%
   sockfs`sotpi_recvmsg                                        1   0.1%
   genunix`strput                                              1   0.1%
   genunix`timespectohz                                        1   0.1%
   unix`lock_clear_splx                                        1   0.1%
   genunix`read                                                1   0.1%
   genunix`as_segcompar                                        1   0.1%
   unix`atomic_cas_64                                          1   0.1%
   unix`mutex_exit                                             1   0.1%
   genunix`cv_unsleep                                          1   0.1%
   unix`putnext                                                1   0.1%
   unix`intr_thread                                            1   0.1%
   genunix`hrt2tv                                              1   0.1%
   sockfs`socktpi_poll                                         1   0.1%
   unix`sfmmu_mlspl_enter                                      1   0.1%
   SUNW,UltraSPARC-IIi`get_ecache_tag                          1   0.1%
   SUNW,UltraSPARC-IIi`gethrestime                             1   0.1%
   genunix`cv_timedwait_sig                                    1   0.1%
   genunix`getq_noenab                                         1   0.1%
   SUNW,UltraSPARC-IIi`flushecacheline                         1   0.1%
   unix`utl0                                                   1   0.1%
   genunix`anon_alloc                                          1   0.1%
   unix`page_downgrade                                         1   0.1%
   unix`setfrontdq                                             1   0.1%
   genunix`timeout_common                                      1   0.1%
   unix`bzero                                                  1   0.1%
   unix`ktl0                                                   2   0.1%
   genunix`canputnext                                          2   0.1%
   genunix`clear_active_fd                                     2   0.1%
   unix`sfmmu_tlb_demap                                        2   0.1%
   unix`page_vpadd                                             2   0.1%
   SUNW,UltraSPARC-IIi`check_ecache_line                       2   0.1%
   genunix`cyclic_softint                                      2   0.1%
   genunix`restore_mstate                                      2   0.1%
   genunix`anon_map_getpages                                   2   0.1%
   genunix`putq                                                2   0.1%
   unix`page_lookup_create                                     2   0.1%
   dtrace`dtrace_dynvar_clean                                  2   0.1%
   unix`sfmmu_pageunload                                       2   0.1%
   genunix`cpu_decay                                           2   0.1%
   genunix`kmem_cache_alloc                                    3   0.2%
   unix`rw_exit                                                3   0.2%
   tl`tl_wput_data_ser                                         3   0.2%
   unix`page_get_replacement_page                              3   0.2%
   unix`page_sub                                               3   0.2%
   genunix`clock                                               3   0.2%
   SUNW,UltraSPARC-IIi`copyout                                 3   0.2%
   unix`mutex_enter                                            4   0.2%
   genunix`pcache_poll                                         5   0.3%
   SUNW,UltraSPARC-IIi`scrub_ecache_line                       5   0.3%
   SUNW,UltraSPARC-IIi`hwblkpagecopy                          22   1.2%
   SUNW,UltraSPARC-IIi`hwblkclr                               39   2.1%
   unix`generic_idle_cpu                                     506  26.8%
   unix`idle                                                1199  63.5%

Which shows the most common function is unix`idle.




Now the hotkernel tool is demonstrated with the -m option, to only print
out samples by module,

   # ./hotkernel -m
   Sampling... Hit Ctrl-C to end.
   ^C
   MODULE                                                  COUNT   PCNT
   usbms                                                       1   0.0%
   specfs                                                      1   0.0%
   uhci                                                        1   0.0%
   sockfs                                                      2   0.0%
   genunix                                                    28   0.6%
   unix                                                     4539  99.3%

Here, genunix and unix (the two core parts of the kernel) were the most
common module to be executing on-CPU.