15bf5ca77SDevin Teske# -*- tab-width: 4 -*- ;; Emacs 25bf5ca77SDevin Teske# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM 35bf5ca77SDevin Teske############################################################ IDENT(1) 45bf5ca77SDevin Teske# 55bf5ca77SDevin Teske# $Title: dwatch(8) module for dtrace_sched(4) $ 65bf5ca77SDevin Teske# $Copyright: 2014-2018 Devin Teske. All rights reserved. $ 75bf5ca77SDevin Teske# 85bf5ca77SDevin Teske############################################################ DESCRIPTION 95bf5ca77SDevin Teske# 105bf5ca77SDevin Teske# Display CPU scheduling activity 115bf5ca77SDevin Teske# 125bf5ca77SDevin Teske############################################################ PROBE 135bf5ca77SDevin Teske 145bf5ca77SDevin Teskecase "$PROFILE" in 155bf5ca77SDevin Teskesched) 165bf5ca77SDevin Teske : ${PROBE:=sched:::} ;; 175bf5ca77SDevin Teskesched-cpu) 185bf5ca77SDevin Teske : ${PROBE:=sched:::off-cpu, sched:::on-cpu, sched:::remain-cpu} ;; 195bf5ca77SDevin Teskesched-exec) 205bf5ca77SDevin Teske : ${PROBE:=sched:::sleep, sched:::wakeup} ;; 215bf5ca77SDevin Teskesched-pri) 225bf5ca77SDevin Teske : ${PROBE:=sched:::change-pri, sched:::lend-pri} ;; 235bf5ca77SDevin Teskesched-queue) 245bf5ca77SDevin Teske : ${PROBE:=sched:::dequeue, sched:::enqueue, sched:::load-change} ;; 255bf5ca77SDevin Teske*) 265bf5ca77SDevin Teske : ${PROBE:=sched:::${PROFILE#sched-}} 275bf5ca77SDevin Teskeesac 285bf5ca77SDevin Teske 295bf5ca77SDevin Teske############################################################ ACTIONS 305bf5ca77SDevin Teske 315bf5ca77SDevin Teskeexec 9<<EOF 325bf5ca77SDevin Teskethis pid_t pid; 335bf5ca77SDevin Teskethis string args; 345bf5ca77SDevin Teskethis string details; 355bf5ca77SDevin Teskethis u_char curprio; 365bf5ca77SDevin Teske 375bf5ca77SDevin Teske$PROBE /* probe ID $ID */ 385bf5ca77SDevin Teske{${TRACE:+ 395bf5ca77SDevin Teske printf("<$ID>");} 405bf5ca77SDevin Teske this->args = this->args0; 415bf5ca77SDevin Teske this->details = ""; 425bf5ca77SDevin Teske this->pid = this->pid0; 435bf5ca77SDevin Teske} 445bf5ca77SDevin Teske 455bf5ca77SDevin Teskesched:::change-pri, sched:::dequeue, sched:::enqueue, 465bf5ca77SDevin Teskesched:::lend-pri, sched:::off-cpu, sched:::surrender, 475bf5ca77SDevin Teskesched:::tick, sched:::wakeup /* probe ID $(( $ID + 1 )) */ 485bf5ca77SDevin Teske{${TRACE:+ 495bf5ca77SDevin Teske printf("<$(( $ID + 1 ))>");} 505bf5ca77SDevin Teske this->curprio = (u_char)((struct thread *)args[0])->td_priority; 515bf5ca77SDevin Teske 525bf5ca77SDevin Teske $( pproc -P _sched "(struct proc *)args[1]" ) 535bf5ca77SDevin Teske 545bf5ca77SDevin Teske this->args = this->args_sched; 555bf5ca77SDevin Teske this->pid = this->pid_sched; 565bf5ca77SDevin Teske} 575bf5ca77SDevin Teske 585bf5ca77SDevin Teskesched:::enqueue /* probe ID $(( $ID + 2 )) */ 595bf5ca77SDevin Teske{${TRACE:+ 605bf5ca77SDevin Teske printf("<$(( $ID + 2 ))>");} 615bf5ca77SDevin Teske /* details = "head" or "tail" */ 625bf5ca77SDevin Teske this->details = (int)arg3 == 0 ? "tail" : "head"; 635bf5ca77SDevin Teske} 645bf5ca77SDevin Teske 655bf5ca77SDevin Teskesched:::change-pri, sched:::lend-pri /* probe ID $(( $ID + 3 )) */ 665bf5ca77SDevin Teske{${TRACE:+ 675bf5ca77SDevin Teske printf("<$(( $ID + 3 ))>");} 6876a4e1dcSDevin Teske /* details = "<curprio> -> <arg2>" */ 695bf5ca77SDevin Teske this->details = strjoin(lltostr(this->curprio), 705bf5ca77SDevin Teske strjoin("->", lltostr((uint8_t)arg2))); 715bf5ca77SDevin Teske} 725bf5ca77SDevin Teske 735bf5ca77SDevin Teskesched:::load-change /* probe ID $(( $ID + 4 )) */ 745bf5ca77SDevin Teske{${TRACE:+ 755bf5ca77SDevin Teske printf("<$(( $ID + 4 ))>");} 765bf5ca77SDevin Teske /* details = "CPU<arg0> queue <arg1>" */ 775bf5ca77SDevin Teske this->details = strjoin(strjoin("CPU", lltostr((int)arg0)), 785bf5ca77SDevin Teske strjoin(" queue ", lltostr((int)arg1))); 795bf5ca77SDevin Teske} 805bf5ca77SDevin Teske 815bf5ca77SDevin Teske$PROBE /* probe ID $(( $ID + 5 )) */ 825bf5ca77SDevin Teske{${TRACE:+ 835bf5ca77SDevin Teske printf("<$(( $ID + 5 ))>");} 845bf5ca77SDevin Teske /* details += " pid <pid> -- <proc args of pid>" */ 855bf5ca77SDevin Teske this->details = strjoin(this->details, this->details == "" ? "" : " "); 865bf5ca77SDevin Teske this->details = strjoin(this->details, strjoin( 8776a4e1dcSDevin Teske strjoin("pid ", lltostr(this->pid)), 885bf5ca77SDevin Teske strjoin(" -- ", this->args))); 895bf5ca77SDevin Teske} 905bf5ca77SDevin TeskeEOF 915bf5ca77SDevin TeskeACTIONS=$( cat <&9 ) 925bf5ca77SDevin TeskeID=$(( $ID + 6 )) 935bf5ca77SDevin Teske 945bf5ca77SDevin Teske############################################################ EVENT DETAILS 955bf5ca77SDevin Teske 96*a061d970SDevin Teskeif [ ! "$CUSTOM_DETAILS" ]; then 975bf5ca77SDevin Teskeexec 9<<EOF 985bf5ca77SDevin Teske /* 995bf5ca77SDevin Teske * Print scheduling details 1005bf5ca77SDevin Teske */ 1015bf5ca77SDevin Teske printf("%s %s", probename, this->details); 1025bf5ca77SDevin TeskeEOF 1035bf5ca77SDevin TeskeEVENT_DETAILS=$( cat <&9 ) 104*a061d970SDevin Teskefi 1055bf5ca77SDevin Teske 1065bf5ca77SDevin Teske################################################################################ 1075bf5ca77SDevin Teske# END 1085bf5ca77SDevin Teske################################################################################ 109