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