xref: /freebsd/cddl/usr.sbin/dwatch/libexec/sched (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
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