#!/usr/bin/bpftrace kprobe:irq_thread+191 /curtask->prio < 99/ { // pre schedule() @allow_s_state[tid] = 1; } kprobe:irq_thread+196 /curtask->prio < 99/ { // post schedule() delete(@allow_s_state[tid]); } kprobe:smpboot_thread_fn+219 /curtask->prio < 99/ { // pre schedule() @allow_s_state[tid] = 1; } kprobe:smpboot_thread_fn+224 /curtask->prio < 99/ { // post schedule() delete(@allow_s_state[tid]); } kprobe:do_nanosleep /curtask->prio < 99/ { @allow_s_state[tid] = 1; } kretprobe:do_nanosleep /curtask->prio < 99/ { delete(@allow_s_state[tid]); } kprobe:futex_lock_pi /curtask->prio < 99/ { @allow_s_state[tid] = 1; } kretprobe:futex_lock_pi /curtask->prio < 99/ { delete(@allow_s_state[tid]); } tracepoint:sched:sched_switch /args->prev_prio < 99 && nsecs > @starttime/ { if (!@ready) { @ready = 1; printf("Ready.\n"); } // handle preempted run if (@schedout_r_state[args->next_pid]) { $val = @schedout_r_state[args->next_pid]; printf("%lu: preempted run: pid=%d prio=%d comm=%s nsecs=%ld\n", nsecs, args->next_pid, args->next_prio, args->next_comm, nsecs - $val); delete(@schedout_r_state[args->next_pid]); } if (args->prev_state == 0) { @schedout_r_state[args->prev_pid] = nsecs; return; } // handle sleeping if (args->prev_state != 1) { return; } if (@allow_s_state[args->prev_pid]) { delete(@allow_s_state[args->prev_pid]); return; } printf("%lu: sleeping: pid=%d prio=%d comm=%s%s\n", nsecs, args->prev_pid, args->prev_prio, args->prev_comm, kstack); delete(@allow_s_state[args->prev_pid]); } tracepoint:exceptions:page_fault_kernel /curtask->prio < 99/ { printf("%lu: kernel page fault: pid=%d prio=%d comm=%s%s\n", nsecs, tid, curtask->prio, curtask->comm, kstack); } tracepoint:exceptions:page_fault_user /curtask->prio < 99/ { printf("%lu: user page fault: pid=%d prio=%d comm=%s\n", nsecs, tid, curtask->prio, curtask->comm); } kprobe:do_futex /curtask->prio < 99/ { $op = arg1 & 0x7f; if ($op == 0) { printf("%lu: non-PI futex wait: pid=%d prio=%d comm=%s op=%d %s\n", nsecs, tid, curtask->prio, curtask->comm, $op, kstack); } } interval:s:600 { exit(); } BEGIN { @starttime = nsecs + 1000000000 } END { clear(@allow_s_state); clear(@schedout_r_state); clear(@starttime); clear(@ready); }