xref: /xnu-12377.41.6/tools/trace/wqtrace.lua (revision bbb1b6f9e71b8cdde6e5cd6f4841f207dee3d828)
1*bbb1b6f9SApple OSS Distributions#!/usr/local/bin/luatrace -s
2*bbb1b6f9SApple OSS Distributions
3*bbb1b6f9SApple OSS Distributionstrace_codename = function(codename, callback)
4*bbb1b6f9SApple OSS Distributions	local debugid = trace.debugid(codename)
5*bbb1b6f9SApple OSS Distributions	if debugid ~= 0 then
6*bbb1b6f9SApple OSS Distributions		trace.single(debugid,callback)
7*bbb1b6f9SApple OSS Distributions	else
8*bbb1b6f9SApple OSS Distributions		printf("WARNING: Cannot locate debugid for '%s'\n", codename)
9*bbb1b6f9SApple OSS Distributions	end
10*bbb1b6f9SApple OSS Distributionsend
11*bbb1b6f9SApple OSS Distributions
12*bbb1b6f9SApple OSS Distributionsinitial_timestamp = 0
13*bbb1b6f9SApple OSS Distributionspid_map = {};
14*bbb1b6f9SApple OSS Distributionsget_prefix = function(buf)
15*bbb1b6f9SApple OSS Distributions	if initial_timestamp == 0 then
16*bbb1b6f9SApple OSS Distributions		initial_timestamp = buf.timestamp
17*bbb1b6f9SApple OSS Distributions	end
18*bbb1b6f9SApple OSS Distributions	local secs = trace.convert_timestamp_to_nanoseconds(buf.timestamp - initial_timestamp) / 1000000000
19*bbb1b6f9SApple OSS Distributions
20*bbb1b6f9SApple OSS Distributions	local prefix
21*bbb1b6f9SApple OSS Distributions	if trace.debugid_is_start(buf.debugid) then
22*bbb1b6f9SApple OSS Distributions		prefix = "→"
23*bbb1b6f9SApple OSS Distributions	elseif trace.debugid_is_end(buf.debugid) then
24*bbb1b6f9SApple OSS Distributions		prefix = "←"
25*bbb1b6f9SApple OSS Distributions	else
26*bbb1b6f9SApple OSS Distributions		prefix = "↔"
27*bbb1b6f9SApple OSS Distributions	end
28*bbb1b6f9SApple OSS Distributions
29*bbb1b6f9SApple OSS Distributions	local proc
30*bbb1b6f9SApple OSS Distributions	if buf.pid == buf[1] then
31*bbb1b6f9SApple OSS Distributions		proc = buf.command
32*bbb1b6f9SApple OSS Distributions		if pid_map[buf[1]] == nil then
33*bbb1b6f9SApple OSS Distributions			pid_map[buf[1]] = buf.command
34*bbb1b6f9SApple OSS Distributions		end
35*bbb1b6f9SApple OSS Distributions	elseif pid_map[buf[1]] ~= nil then
36*bbb1b6f9SApple OSS Distributions		proc = pid_map[buf[1]]
37*bbb1b6f9SApple OSS Distributions	else
38*bbb1b6f9SApple OSS Distributions		proc = "UNKNOWN"
39*bbb1b6f9SApple OSS Distributions	end
40*bbb1b6f9SApple OSS Distributions
41*bbb1b6f9SApple OSS Distributions	return string.format("%s %6.9f %-17s [%05d.%06x] %-24s",
42*bbb1b6f9SApple OSS Distributions		prefix, secs, proc, buf.pid, buf.threadid, buf.debugname)
43*bbb1b6f9SApple OSS Distributionsend
44*bbb1b6f9SApple OSS Distributions
45*bbb1b6f9SApple OSS Distributionsparse_pthread_priority = function(pri)
46*bbb1b6f9SApple OSS Distributions	pri = pri & 0xffffffff
47*bbb1b6f9SApple OSS Distributions	if (pri & 0x02000000) == 0x02000000 then
48*bbb1b6f9SApple OSS Distributions		return "Manager"
49*bbb1b6f9SApple OSS Distributions	end
50*bbb1b6f9SApple OSS Distributions	local qos = (pri & 0x00ffff00) >> 8
51*bbb1b6f9SApple OSS Distributions	if qos == 0x20 then
52*bbb1b6f9SApple OSS Distributions		return string.format("UI[%x]", pri);
53*bbb1b6f9SApple OSS Distributions	elseif qos == 0x10 then
54*bbb1b6f9SApple OSS Distributions		return string.format("IN[%x]", pri);
55*bbb1b6f9SApple OSS Distributions	elseif qos == 0x08 then
56*bbb1b6f9SApple OSS Distributions		return string.format("DF[%x]", pri);
57*bbb1b6f9SApple OSS Distributions	elseif qos == 0x04 then
58*bbb1b6f9SApple OSS Distributions		return string.format("UT[%x]", pri);
59*bbb1b6f9SApple OSS Distributions	elseif qos == 0x02 then
60*bbb1b6f9SApple OSS Distributions		return string.format("BG[%x]", pri);
61*bbb1b6f9SApple OSS Distributions	elseif qos == 0x01 then
62*bbb1b6f9SApple OSS Distributions		return string.format("MT[%x]", pri);
63*bbb1b6f9SApple OSS Distributions	elseif qos == 0x00 then
64*bbb1b6f9SApple OSS Distributions		return string.format("--[%x]", pri);
65*bbb1b6f9SApple OSS Distributions	else
66*bbb1b6f9SApple OSS Distributions		return string.format("??[%x]", pri);
67*bbb1b6f9SApple OSS Distributions	end
68*bbb1b6f9SApple OSS Distributionsend
69*bbb1b6f9SApple OSS Distributions
70*bbb1b6f9SApple OSS Distributionsparse_thread_qos = function(pri)
71*bbb1b6f9SApple OSS Distributions	if pri == 7 then
72*bbb1b6f9SApple OSS Distributions		return string.format("MG", pri);
73*bbb1b6f9SApple OSS Distributions	elseif pri == 6 then
74*bbb1b6f9SApple OSS Distributions		return string.format("UI", pri);
75*bbb1b6f9SApple OSS Distributions	elseif pri == 5 then
76*bbb1b6f9SApple OSS Distributions		return string.format("IN", pri);
77*bbb1b6f9SApple OSS Distributions	elseif pri == 4 then
78*bbb1b6f9SApple OSS Distributions		return string.format("DF", pri);
79*bbb1b6f9SApple OSS Distributions	elseif pri == 3 then
80*bbb1b6f9SApple OSS Distributions		return string.format("UT", pri);
81*bbb1b6f9SApple OSS Distributions	elseif pri == 2 then
82*bbb1b6f9SApple OSS Distributions		return string.format("BG", pri);
83*bbb1b6f9SApple OSS Distributions	elseif pri == 1 then
84*bbb1b6f9SApple OSS Distributions		return string.format("MT", pri);
85*bbb1b6f9SApple OSS Distributions	elseif pri == 0 then
86*bbb1b6f9SApple OSS Distributions		return string.format("--", pri);
87*bbb1b6f9SApple OSS Distributions	else
88*bbb1b6f9SApple OSS Distributions		return string.format("??[%x]", pri);
89*bbb1b6f9SApple OSS Distributions	end
90*bbb1b6f9SApple OSS Distributionsend
91*bbb1b6f9SApple OSS Distributions
92*bbb1b6f9SApple OSS Distributionsparse_thactive_req_qos = function(pri)
93*bbb1b6f9SApple OSS Distributions	if pri ~= 0 then
94*bbb1b6f9SApple OSS Distributions		return parse_thread_qos(pri)
95*bbb1b6f9SApple OSS Distributions	end
96*bbb1b6f9SApple OSS Distributions	return "None"
97*bbb1b6f9SApple OSS Distributionsend
98*bbb1b6f9SApple OSS Distributions
99*bbb1b6f9SApple OSS Distributionsget_thactive = function(low, high)
100*bbb1b6f9SApple OSS Distributions	return string.format("req: %s, MG: %d, UI: %d, IN: %d, DE: %d, UT: %d, BG: %d, MT: %d",
101*bbb1b6f9SApple OSS Distributions			parse_thactive_req_qos(high >> (16 * 3)), (high >> (2 * 16)) & 0xffff,
102*bbb1b6f9SApple OSS Distributions			(high >> (1 * 16)) & 0xffff, (high >> (0 * 16)) & 0xffff,
103*bbb1b6f9SApple OSS Distributions			(low  >> (3 * 16)) & 0xffff, (low  >> (2 * 16)) & 0xffff,
104*bbb1b6f9SApple OSS Distributions			(low  >> (1 * 16)) & 0xffff, (low  >> (0 * 16)) & 0xffff)
105*bbb1b6f9SApple OSS Distributionsend
106*bbb1b6f9SApple OSS Distributions
107*bbb1b6f9SApple OSS Distributions-- workqueue lifecycle
108*bbb1b6f9SApple OSS Distributions
109*bbb1b6f9SApple OSS Distributionstrace_codename("wq_pthread_exit", function(buf)
110*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
111*bbb1b6f9SApple OSS Distributions	if trace.debugid_is_start(buf.debugid) then
112*bbb1b6f9SApple OSS Distributions		printf("%s\tprocess is exiting\n",prefix)
113*bbb1b6f9SApple OSS Distributions	else
114*bbb1b6f9SApple OSS Distributions		printf("%s\tworkqueue marked as exiting and timer is complete\n",prefix)
115*bbb1b6f9SApple OSS Distributions	end
116*bbb1b6f9SApple OSS Distributionsend)
117*bbb1b6f9SApple OSS Distributions
118*bbb1b6f9SApple OSS Distributionstrace_codename("wq_workqueue_exit", function(buf)
119*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
120*bbb1b6f9SApple OSS Distributions	if trace.debugid_is_start(buf.debugid) then
121*bbb1b6f9SApple OSS Distributions		printf("%s\tall threads have exited, cleaning up\n",prefix)
122*bbb1b6f9SApple OSS Distributions	else
123*bbb1b6f9SApple OSS Distributions		printf("%s\tclean up complete\n",prefix)
124*bbb1b6f9SApple OSS Distributions	end
125*bbb1b6f9SApple OSS Distributionsend)
126*bbb1b6f9SApple OSS Distributions
127*bbb1b6f9SApple OSS Distributionstrace_codename("wq_start_add_timer", function(buf)
128*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
129*bbb1b6f9SApple OSS Distributions	printf("%s\tarming timer to fire in %d us (flags: %x, reqcount: %d)\n",
130*bbb1b6f9SApple OSS Distributions		prefix, buf.arg4, buf.arg3, buf.arg2)
131*bbb1b6f9SApple OSS Distributionsend)
132*bbb1b6f9SApple OSS Distributions
133*bbb1b6f9SApple OSS Distributionstrace_codename("wq_add_timer", function(buf)
134*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
135*bbb1b6f9SApple OSS Distributions	if trace.debugid_is_start(buf.debugid) then
136*bbb1b6f9SApple OSS Distributions		printf("%s\tadd_timer fired (flags: %x, nthreads: %d, thidlecount: %d)\n",
137*bbb1b6f9SApple OSS Distributions			prefix, buf.arg2, buf.arg3, buf.arg4)
138*bbb1b6f9SApple OSS Distributions	elseif trace.debugid_is_end(buf.debugid) then
139*bbb1b6f9SApple OSS Distributions		printf("%s\tadd_timer completed (start_timer: %x, nthreads: %d, thidlecount: %d)\n",
140*bbb1b6f9SApple OSS Distributions			prefix, buf.arg2, buf.arg3, buf.arg4)
141*bbb1b6f9SApple OSS Distributions	end
142*bbb1b6f9SApple OSS Distributionsend)
143*bbb1b6f9SApple OSS Distributions
144*bbb1b6f9SApple OSS Distributionstrace_codename("wq_select_threadreq", function(buf)
145*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
146*bbb1b6f9SApple OSS Distributions	if buf[2] == 0 then
147*bbb1b6f9SApple OSS Distributions		printf("%s\tSelection failed: process exiting\n", prefix)
148*bbb1b6f9SApple OSS Distributions	elseif buf[2] == 1 then
149*bbb1b6f9SApple OSS Distributions		printf("%s\tSelection failed: no request\n", prefix)
150*bbb1b6f9SApple OSS Distributions	elseif buf[2] == 2 then
151*bbb1b6f9SApple OSS Distributions		printf("%s\tSelection failed: throttled\n", prefix)
152*bbb1b6f9SApple OSS Distributions	elseif buf[2] == 3 then
153*bbb1b6f9SApple OSS Distributions		printf("%s\tSelection failed: scheduler would preempt\n", prefix)
154*bbb1b6f9SApple OSS Distributions	end
155*bbb1b6f9SApple OSS Distributionsend)
156*bbb1b6f9SApple OSS Distributions
157*bbb1b6f9SApple OSS Distributionstrace_codename("wq_creator_select", function(buf)
158*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
159*bbb1b6f9SApple OSS Distributions	if buf[2] == 1 then
160*bbb1b6f9SApple OSS Distributions		printf("%s\t\tcreator %x overridden at %s\n", prefix, buf[3],
161*bbb1b6f9SApple OSS Distributions			parse_thread_qos(buf[4]))
162*bbb1b6f9SApple OSS Distributions	elseif buf[2] == 2 then
163*bbb1b6f9SApple OSS Distributions		printf("%s\t\tcreator %x selected at %s\n", prefix, buf[3],
164*bbb1b6f9SApple OSS Distributions			parse_thread_qos(buf[4]))
165*bbb1b6f9SApple OSS Distributions	elseif buf[2] == 3 then
166*bbb1b6f9SApple OSS Distributions		printf("%s\t\tcreator idled (%d yields)\n", prefix, buf[4])
167*bbb1b6f9SApple OSS Distributions	elseif buf[2] == 4 then
168*bbb1b6f9SApple OSS Distributions		printf("%s\t\tcreator removed (%d yields)\n", prefix, buf[4])
169*bbb1b6f9SApple OSS Distributions	end
170*bbb1b6f9SApple OSS Distributionsend)
171*bbb1b6f9SApple OSS Distributions
172*bbb1b6f9SApple OSS Distributionstrace_codename("wq_creator_yield", function(buf)
173*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
174*bbb1b6f9SApple OSS Distributions	local reason = "unknown"
175*bbb1b6f9SApple OSS Distributions	if buf[2] == 1 then
176*bbb1b6f9SApple OSS Distributions		reason = "fast steal rate"
177*bbb1b6f9SApple OSS Distributions	elseif buf[2] == 2 then
178*bbb1b6f9SApple OSS Distributions		reason = "above ncpu scheduled"
179*bbb1b6f9SApple OSS Distributions	end
180*bbb1b6f9SApple OSS Distributions	printf("%s\t\tcreator yielded (%s, current:%d snapshot:%d)\n",
181*bbb1b6f9SApple OSS Distributions			prefix, reason, buf[3], buf[4])
182*bbb1b6f9SApple OSS Distributionsend)
183*bbb1b6f9SApple OSS Distributions
184*bbb1b6f9SApple OSS Distributionstrace_codename("wq_thread_logical_run", function(buf)
185*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
186*bbb1b6f9SApple OSS Distributions	if trace.debugid_is_start(buf.debugid) then
187*bbb1b6f9SApple OSS Distributions		printf("%s\tthread unparking (request %x)\n", prefix, buf[2])
188*bbb1b6f9SApple OSS Distributions	else
189*bbb1b6f9SApple OSS Distributions		printf("%s\tthread parking\n", prefix)
190*bbb1b6f9SApple OSS Distributions	end
191*bbb1b6f9SApple OSS Distributionsend)
192*bbb1b6f9SApple OSS Distributions
193*bbb1b6f9SApple OSS Distributionstrace.enable_thread_cputime()
194*bbb1b6f9SApple OSS Distributionsrunthread_time_map = {}
195*bbb1b6f9SApple OSS Distributionsrunthread_cputime_map = {}
196*bbb1b6f9SApple OSS Distributionstrace_codename("wq_runthread", function(buf)
197*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
198*bbb1b6f9SApple OSS Distributions	if trace.debugid_is_start(buf.debugid) then
199*bbb1b6f9SApple OSS Distributions		printf("%s\tSTART running thread\n", prefix)
200*bbb1b6f9SApple OSS Distributions		runthread_time_map[buf.threadid] = buf.timestamp;
201*bbb1b6f9SApple OSS Distributions		runthread_cputime_map[buf.threadid] = trace.cputime_for_thread(buf.threadid);
202*bbb1b6f9SApple OSS Distributions	elseif runthread_time_map[buf.threadid] then
203*bbb1b6f9SApple OSS Distributions		local time = buf.timestamp - runthread_time_map[buf.threadid]
204*bbb1b6f9SApple OSS Distributions		local cputime = trace.cputime_for_thread(buf.threadid) - runthread_cputime_map[buf.threadid]
205*bbb1b6f9SApple OSS Distributions
206*bbb1b6f9SApple OSS Distributions		local time_ms = trace.convert_timestamp_to_nanoseconds(time) / 1000000
207*bbb1b6f9SApple OSS Distributions		local cputime_ms = trace.convert_timestamp_to_nanoseconds(cputime) / 1000000
208*bbb1b6f9SApple OSS Distributions
209*bbb1b6f9SApple OSS Distributions		printf("%s\tDONE running thread: time = %6.6f ms, cputime = %6.6f ms\n",
210*bbb1b6f9SApple OSS Distributions				prefix, time_ms, cputime_ms)
211*bbb1b6f9SApple OSS Distributions
212*bbb1b6f9SApple OSS Distributions		runthread_time_map[buf.threadid] = 0
213*bbb1b6f9SApple OSS Distributions		runthread_cputime_map[buf.threadid] = 0
214*bbb1b6f9SApple OSS Distributions	elseif trace.debugid_is_end(buf.debugid) then
215*bbb1b6f9SApple OSS Distributions		printf("%s\tDONE running thread\n", prefix)
216*bbb1b6f9SApple OSS Distributions	end
217*bbb1b6f9SApple OSS Distributionsend)
218*bbb1b6f9SApple OSS Distributions
219*bbb1b6f9SApple OSS Distributionstrace_codename("wq_thactive_update", function(buf)
220*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
221*bbb1b6f9SApple OSS Distributions	local thactive = get_thactive(buf[2], buf[3])
222*bbb1b6f9SApple OSS Distributions	printf("%s\tthactive updated (%s)\n", prefix, thactive)
223*bbb1b6f9SApple OSS Distributionsend)
224*bbb1b6f9SApple OSS Distributions
225*bbb1b6f9SApple OSS Distributionstrace_codename("wq_thread_block", function(buf)
226*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
227*bbb1b6f9SApple OSS Distributions	local req_pri = parse_thread_qos(buf[3] >> 8)
228*bbb1b6f9SApple OSS Distributions	if trace.debugid_is_start(buf.debugid) then
229*bbb1b6f9SApple OSS Distributions		printf("%s\tthread blocked (activecount: %d, priority: %s, req_pri: %s, reqcount: %d, start_timer: %d)\n",
230*bbb1b6f9SApple OSS Distributions			prefix, buf[2], parse_thread_qos(buf[3] & 0xff), req_pri, buf[4] >> 1, buf[4] & 0x1)
231*bbb1b6f9SApple OSS Distributions	else
232*bbb1b6f9SApple OSS Distributions		printf("%s\tthread unblocked (activecount: %d, priority: %s, req_pri: %s, threads_scheduled: %d)\n",
233*bbb1b6f9SApple OSS Distributions			prefix, buf[2], parse_thread_qos(buf[3] & 0xff), req_pri, buf[4])
234*bbb1b6f9SApple OSS Distributions	end
235*bbb1b6f9SApple OSS Distributionsend)
236*bbb1b6f9SApple OSS Distributions
237*bbb1b6f9SApple OSS Distributionstrace_codename("wq_thread_create_failed", function(buf)
238*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
239*bbb1b6f9SApple OSS Distributions	if buf[3] == 0 then
240*bbb1b6f9SApple OSS Distributions		printf("%s\tfailed to create new workqueue thread, kern_return: 0x%x\n",
241*bbb1b6f9SApple OSS Distributions			prefix, buf[2])
242*bbb1b6f9SApple OSS Distributions	elseif buf[3] == 1 then
243*bbb1b6f9SApple OSS Distributions		printf("%s\tfailed to vm_map workq thread stack: 0x%x\n", prefix, buf[2])
244*bbb1b6f9SApple OSS Distributions	elseif buf[3] == 2 then
245*bbb1b6f9SApple OSS Distributions		printf("%s\tfailed to vm_protect workq thread guardsize: 0x%x\n", prefix, buf[2])
246*bbb1b6f9SApple OSS Distributions	end
247*bbb1b6f9SApple OSS Distributionsend)
248*bbb1b6f9SApple OSS Distributions
249*bbb1b6f9SApple OSS Distributionstrace_codename("wq_thread_create", function(buf)
250*bbb1b6f9SApple OSS Distributions	printf("%s\tcreated new workqueue thread\n", get_prefix(buf))
251*bbb1b6f9SApple OSS Distributionsend)
252*bbb1b6f9SApple OSS Distributions
253*bbb1b6f9SApple OSS Distributionstrace_codename("wq_thread_terminate", function(buf)
254*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
255*bbb1b6f9SApple OSS Distributions	local what
256*bbb1b6f9SApple OSS Distributions	if trace.debugid_is_start(buf.debugid) then
257*bbb1b6f9SApple OSS Distributions		what = "try to terminate thread"
258*bbb1b6f9SApple OSS Distributions	else
259*bbb1b6f9SApple OSS Distributions		what = "terminated thread"
260*bbb1b6f9SApple OSS Distributions	end
261*bbb1b6f9SApple OSS Distributions	printf("%s\t%s: currently idle %d\n", prefix, what, buf[2])
262*bbb1b6f9SApple OSS Distributionsend)
263*bbb1b6f9SApple OSS Distributions
264*bbb1b6f9SApple OSS Distributionstrace_codename("wq_wqops_reqthreads", function(buf)
265*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
266*bbb1b6f9SApple OSS Distributions	printf("%s\tlegacy thread request made for %d threads at %s\n", prefix, buf[2], parse_pthread_priority(buf[3]));
267*bbb1b6f9SApple OSS Distributionsend)
268*bbb1b6f9SApple OSS Distributions
269*bbb1b6f9SApple OSS Distributionstrace_codename("wq_thread_request_initiate", function(buf)
270*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
271*bbb1b6f9SApple OSS Distributions	printf("%s\tthread request %x made at %s (count:%d)\n", prefix, buf[2], parse_thread_qos(buf[3]), buf[4]);
272*bbb1b6f9SApple OSS Distributionsend)
273*bbb1b6f9SApple OSS Distributions
274*bbb1b6f9SApple OSS Distributionstrace_codename("wq_thread_request_modify", function(buf)
275*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
276*bbb1b6f9SApple OSS Distributions	printf("%s\tthread request %x priorty updated to %s\n", prefix, buf[2], parse_thread_qos(buf[3]));
277*bbb1b6f9SApple OSS Distributionsend)
278*bbb1b6f9SApple OSS Distributions
279*bbb1b6f9SApple OSS Distributionstrace_codename("wq_thread_request_cancel", function(buf)
280*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
281*bbb1b6f9SApple OSS Distributions	printf("%s\tthread request %x canceled\n", prefix, buf[2], parse_thread_qos(buf[3]));
282*bbb1b6f9SApple OSS Distributionsend)
283*bbb1b6f9SApple OSS Distributions
284*bbb1b6f9SApple OSS Distributionstrace_codename("wq_constrained_admission", function(buf)
285*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
286*bbb1b6f9SApple OSS Distributions	if buf[2] == 1 then
287*bbb1b6f9SApple OSS Distributions		printf("fail: %s\twq_constrained_threads_scheduled=%d >= wq_max_constrained_threads=%d\n",
288*bbb1b6f9SApple OSS Distributions				prefix, buf[3], buf[4])
289*bbb1b6f9SApple OSS Distributions	elseif (buf[2] == 2) or (buf[2] == 3) then
290*bbb1b6f9SApple OSS Distributions		local success = nil;
291*bbb1b6f9SApple OSS Distributions		if buf[2] == 2 then success = "success"
292*bbb1b6f9SApple OSS Distributions		else success = "fail" end
293*bbb1b6f9SApple OSS Distributions		printf("%s\t%s\tthactive_count=%d + busycount=%d >= wq->wq_max_concurrency\n",
294*bbb1b6f9SApple OSS Distributions				prefix, success, buf[3], buf[4])
295*bbb1b6f9SApple OSS Distributions	end
296*bbb1b6f9SApple OSS Distributionsend)
297*bbb1b6f9SApple OSS Distributions
298*bbb1b6f9SApple OSS Distributionstrace_codename("wq_cooperative_admission", function(buf)
299*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
300*bbb1b6f9SApple OSS Distributions	if (buf[4] == 1) then
301*bbb1b6f9SApple OSS Distributions		printf("%s\tsuccess at qos %s\t wq_cooperative_threads_scheduled=%d >= wq_max_cooperative_threads\n",
302*bbb1b6f9SApple OSS Distributions			prefix, parse_thread_qos(buf[2]), buf[1])
303*bbb1b6f9SApple OSS Distributions	elseif (buf[4] == 2) then
304*bbb1b6f9SApple OSS Distributions		printf("%s\tsuccess at qos %s\t due to empty bucket, wq_cooperative_threads_scheduled=%d\n",
305*bbb1b6f9SApple OSS Distributions			prefix, parse_thread_qos(buf[2]), buf[1])
306*bbb1b6f9SApple OSS Distributions	elseif (buf[4] == 3) then
307*bbb1b6f9SApple OSS Distributions		success = "success"
308*bbb1b6f9SApple OSS Distributions		if (buf[3] == 0) then
309*bbb1b6f9SApple OSS Distributions			success = "fail"
310*bbb1b6f9SApple OSS Distributions		end
311*bbb1b6f9SApple OSS Distributions		printf("%s\t%s at qos %s\twq_cooperative_threads_scheduled_up_to_qos=%d\n",
312*bbb1b6f9SApple OSS Distributions			prefix, success, parse_thread_qos(buf[2]), buf[1])
313*bbb1b6f9SApple OSS Distributions	end
314*bbb1b6f9SApple OSS Distributionsend)
315*bbb1b6f9SApple OSS Distributions
316*bbb1b6f9SApple OSS Distributionstrace_codename("wq_death_call", function(buf)
317*bbb1b6f9SApple OSS Distributions	local prefix = get_prefix(buf)
318*bbb1b6f9SApple OSS Distributions	if trace.debugid_is_start(buf.debugid) then
319*bbb1b6f9SApple OSS Distributions		printf("%s\tentering death call\n", prefix);
320*bbb1b6f9SApple OSS Distributions	elseif trace.debugid_is_end(buf.debugid) then
321*bbb1b6f9SApple OSS Distributions		printf("%s\tleaving death call\n", prefix);
322*bbb1b6f9SApple OSS Distributions	else
323*bbb1b6f9SApple OSS Distributions		printf("%s\tscheduling death call\n", prefix);
324*bbb1b6f9SApple OSS Distributions	end
325*bbb1b6f9SApple OSS Distributionsend)
326*bbb1b6f9SApple OSS Distributions--
327*bbb1b6f9SApple OSS Distributions-- vim:ts=4:sw=4:noet:
328