1*5bf5ca77SDevin Teske# -*- tab-width: 4 -*- ;; Emacs 2*5bf5ca77SDevin Teske# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM 3*5bf5ca77SDevin Teske############################################################ IDENT(1) 4*5bf5ca77SDevin Teske# 5*5bf5ca77SDevin Teske# $Title: dwatch(8) module for dtrace_sched(4) $ 6*5bf5ca77SDevin Teske# $Copyright: 2014-2018 Devin Teske. All rights reserved. $ 7*5bf5ca77SDevin Teske# $FreeBSD$ 8*5bf5ca77SDevin Teske# 9*5bf5ca77SDevin Teske############################################################ DESCRIPTION 10*5bf5ca77SDevin Teske# 11*5bf5ca77SDevin Teske# Display CPU scheduling activity 12*5bf5ca77SDevin Teske# 13*5bf5ca77SDevin Teske############################################################ PROBE 14*5bf5ca77SDevin Teske 15*5bf5ca77SDevin Teskecase "$PROFILE" in 16*5bf5ca77SDevin Teskesched) 17*5bf5ca77SDevin Teske : ${PROBE:=sched:::} ;; 18*5bf5ca77SDevin Teskesched-cpu) 19*5bf5ca77SDevin Teske : ${PROBE:=sched:::off-cpu, sched:::on-cpu, sched:::remain-cpu} ;; 20*5bf5ca77SDevin Teskesched-exec) 21*5bf5ca77SDevin Teske : ${PROBE:=sched:::sleep, sched:::wakeup} ;; 22*5bf5ca77SDevin Teskesched-pri) 23*5bf5ca77SDevin Teske : ${PROBE:=sched:::change-pri, sched:::lend-pri} ;; 24*5bf5ca77SDevin Teskesched-queue) 25*5bf5ca77SDevin Teske : ${PROBE:=sched:::dequeue, sched:::enqueue, sched:::load-change} ;; 26*5bf5ca77SDevin Teske*) 27*5bf5ca77SDevin Teske : ${PROBE:=sched:::${PROFILE#sched-}} 28*5bf5ca77SDevin Teskeesac 29*5bf5ca77SDevin Teske 30*5bf5ca77SDevin Teske############################################################ ACTIONS 31*5bf5ca77SDevin Teske 32*5bf5ca77SDevin Teskeexec 9<<EOF 33*5bf5ca77SDevin Teskethis pid_t pid; 34*5bf5ca77SDevin Teskethis string args; 35*5bf5ca77SDevin Teskethis string details; 36*5bf5ca77SDevin Teskethis u_char curprio; 37*5bf5ca77SDevin Teske 38*5bf5ca77SDevin Teske$PROBE /* probe ID $ID */ 39*5bf5ca77SDevin Teske{${TRACE:+ 40*5bf5ca77SDevin Teske printf("<$ID>");} 41*5bf5ca77SDevin Teske this->args = this->args0; 42*5bf5ca77SDevin Teske this->details = ""; 43*5bf5ca77SDevin Teske this->pid = this->pid0; 44*5bf5ca77SDevin Teske} 45*5bf5ca77SDevin Teske 46*5bf5ca77SDevin Teskesched:::change-pri, sched:::dequeue, sched:::enqueue, 47*5bf5ca77SDevin Teskesched:::lend-pri, sched:::off-cpu, sched:::surrender, 48*5bf5ca77SDevin Teskesched:::tick, sched:::wakeup /* probe ID $(( $ID + 1 )) */ 49*5bf5ca77SDevin Teske{${TRACE:+ 50*5bf5ca77SDevin Teske printf("<$(( $ID + 1 ))>");} 51*5bf5ca77SDevin Teske this->curprio = (u_char)((struct thread *)args[0])->td_priority; 52*5bf5ca77SDevin Teske 53*5bf5ca77SDevin Teske $( pproc -P _sched "(struct proc *)args[1]" ) 54*5bf5ca77SDevin Teske 55*5bf5ca77SDevin Teske this->args = this->args_sched; 56*5bf5ca77SDevin Teske this->pid = this->pid_sched; 57*5bf5ca77SDevin Teske} 58*5bf5ca77SDevin Teske 59*5bf5ca77SDevin Teskesched:::enqueue /* probe ID $(( $ID + 2 )) */ 60*5bf5ca77SDevin Teske{${TRACE:+ 61*5bf5ca77SDevin Teske printf("<$(( $ID + 2 ))>");} 62*5bf5ca77SDevin Teske /* details = "head" or "tail" */ 63*5bf5ca77SDevin Teske this->details = (int)arg3 == 0 ? "tail" : "head"; 64*5bf5ca77SDevin Teske} 65*5bf5ca77SDevin Teske 66*5bf5ca77SDevin Teskesched:::change-pri, sched:::lend-pri /* probe ID $(( $ID + 3 )) */ 67*5bf5ca77SDevin Teske{${TRACE:+ 68*5bf5ca77SDevin Teske printf("<$(( $ID + 3 ))>");} 69*5bf5ca77SDevin Teske /* details = "<curprio> -> arg2" */ 70*5bf5ca77SDevin Teske this->details = strjoin(lltostr(this->curprio), 71*5bf5ca77SDevin Teske strjoin("->", lltostr((uint8_t)arg2))); 72*5bf5ca77SDevin Teske} 73*5bf5ca77SDevin Teske 74*5bf5ca77SDevin Teskesched:::load-change /* probe ID $(( $ID + 4 )) */ 75*5bf5ca77SDevin Teske{${TRACE:+ 76*5bf5ca77SDevin Teske printf("<$(( $ID + 4 ))>");} 77*5bf5ca77SDevin Teske /* details = "CPU<arg0> queue <arg1>" */ 78*5bf5ca77SDevin Teske this->details = strjoin(strjoin("CPU", lltostr((int)arg0)), 79*5bf5ca77SDevin Teske strjoin(" queue ", lltostr((int)arg1))); 80*5bf5ca77SDevin Teske} 81*5bf5ca77SDevin Teske 82*5bf5ca77SDevin Teske$PROBE /* probe ID $(( $ID + 5 )) */ 83*5bf5ca77SDevin Teske{${TRACE:+ 84*5bf5ca77SDevin Teske printf("<$(( $ID + 5 ))>");} 85*5bf5ca77SDevin Teske /* details += " pid <pid> -- <proc args of pid>" */ 86*5bf5ca77SDevin Teske this->details = strjoin(this->details, this->details == "" ? "" : " "); 87*5bf5ca77SDevin Teske this->details = strjoin(this->details, strjoin( 88*5bf5ca77SDevin Teske strjoin("pid ", lltostr(this->pid_sched)), 89*5bf5ca77SDevin Teske strjoin(" -- ", this->args))); 90*5bf5ca77SDevin Teske} 91*5bf5ca77SDevin TeskeEOF 92*5bf5ca77SDevin TeskeACTIONS=$( cat <&9 ) 93*5bf5ca77SDevin TeskeID=$(( $ID + 6 )) 94*5bf5ca77SDevin Teske 95*5bf5ca77SDevin Teske############################################################ EVENT DETAILS 96*5bf5ca77SDevin Teske 97*5bf5ca77SDevin Teskeexec 9<<EOF 98*5bf5ca77SDevin Teske /* 99*5bf5ca77SDevin Teske * Print scheduling details 100*5bf5ca77SDevin Teske */ 101*5bf5ca77SDevin Teske printf("%s %s", probename, this->details); 102*5bf5ca77SDevin TeskeEOF 103*5bf5ca77SDevin TeskeEVENT_DETAILS=$( cat <&9 ) 104*5bf5ca77SDevin Teske 105*5bf5ca77SDevin Teske################################################################################ 106*5bf5ca77SDevin Teske# END 107*5bf5ca77SDevin Teske################################################################################ 108