1*a1e26a70SApple OSS Distributions #include <mach/mach.h>
2*a1e26a70SApple OSS Distributions #include <stdlib.h>
3*a1e26a70SApple OSS Distributions #include <stdio.h>
4*a1e26a70SApple OSS Distributions #include <signal.h>
5*a1e26a70SApple OSS Distributions #include <unistd.h>
6*a1e26a70SApple OSS Distributions #include <sys/time.h>
7*a1e26a70SApple OSS Distributions #include <time.h>
8*a1e26a70SApple OSS Distributions #include <mach/error.h>
9*a1e26a70SApple OSS Distributions #include <mach/mach_error.h>
10*a1e26a70SApple OSS Distributions #include <mach/mig_errors.h>
11*a1e26a70SApple OSS Distributions #include <mach/machine.h>
12*a1e26a70SApple OSS Distributions #include <mach/processor_info.h>
13*a1e26a70SApple OSS Distributions #include <assert.h>
14*a1e26a70SApple OSS Distributions #include <nlist.h>
15*a1e26a70SApple OSS Distributions #include <fcntl.h>
16*a1e26a70SApple OSS Distributions #include <string.h>
17*a1e26a70SApple OSS Distributions #include <mach/mach.h>
18*a1e26a70SApple OSS Distributions #include <mach/host_info.h>
19*a1e26a70SApple OSS Distributions
20*a1e26a70SApple OSS Distributions /*
21*a1e26a70SApple OSS Distributions * lockstat.c
22*a1e26a70SApple OSS Distributions *
23*a1e26a70SApple OSS Distributions * Utility to display kernel lock contention statistics.
24*a1e26a70SApple OSS Distributions * Usage:
25*a1e26a70SApple OSS Distributions * lockstat [all, spin, mutex, rw, <lock group name>] {<repeat interval>} {abs}
26*a1e26a70SApple OSS Distributions *
27*a1e26a70SApple OSS Distributions * Argument 1 specifies the type of lock to display contention statistics
28*a1e26a70SApple OSS Distributions * for; alternatively, a lock group (a logically grouped set of locks,
29*a1e26a70SApple OSS Distributions * which can encompass multiple types of locks) can be specified by name.
30*a1e26a70SApple OSS Distributions * When argument 1 is "all", statistics are displayed for all lock groups
31*a1e26a70SApple OSS Distributions * which have statistics enabled.
32*a1e26a70SApple OSS Distributions * Lock types include mutexes, reader-writer locks and spin locks.
33*a1e26a70SApple OSS Distributions * Note that support for gathering contention statistics may not be present
34*a1e26a70SApple OSS Distributions * for all types of locks on all platforms.
35*a1e26a70SApple OSS Distributions *
36*a1e26a70SApple OSS Distributions * Argument 2 specifies a periodic interval. The program will display an
37*a1e26a70SApple OSS Distributions * updated list of statistics every <repeat interval> seconds. This
38*a1e26a70SApple OSS Distributions * argument is optional. The updates display the deltas from the previous
39*a1e26a70SApple OSS Distributions * set of statistics, unless "abs" is specified as argument 3.
40*a1e26a70SApple OSS Distributions *
41*a1e26a70SApple OSS Distributions * Argument 3, if "abs", causes the periodically refreshed lock statistics
42*a1e26a70SApple OSS Distributions * to be displayed as absolute values rather than deltas from the previous
43*a1e26a70SApple OSS Distributions * display.
44*a1e26a70SApple OSS Distributions *
45*a1e26a70SApple OSS Distributions * Types of statistics:
46*a1e26a70SApple OSS Distributions * Acquisitions: These can include both normal acquisitions, as well
47*a1e26a70SApple OSS Distributions * as acquisition attempts. These are listed in the first column.
48*a1e26a70SApple OSS Distributions * Examples include calls to lck_mtx_lock and lck_mtx_try_lock
49*a1e26a70SApple OSS Distributions * Misses: Incremented if a lock acquisition attempt failed, due to
50*a1e26a70SApple OSS Distributions * contention.
51*a1e26a70SApple OSS Distributions * Waits (Meaningful only for lock types that can block): Incremented
52*a1e26a70SApple OSS Distributions * if a lock acquisition attempt proceeded to block.
53*a1e26a70SApple OSS Distributions *
54*a1e26a70SApple OSS Distributions * Direct Waits (currently implemented only on i386/x86_64): For adaptive
55*a1e26a70SApple OSS Distributions * locks, such as mutexes, incremented if the owner of the mutex
56*a1e26a70SApple OSS Distributions * wasn't active on another processor at the time of the lock
57*a1e26a70SApple OSS Distributions * attempt. This indicates that no adaptive spin occurred.
58*a1e26a70SApple OSS Distributions */
59*a1e26a70SApple OSS Distributions
60*a1e26a70SApple OSS Distributions /*
61*a1e26a70SApple OSS Distributions * HISTORY
62*a1e26a70SApple OSS Distributions * 2005: Bernard Semeria
63*a1e26a70SApple OSS Distributions * Created.
64*a1e26a70SApple OSS Distributions * 2006: Derek Kumar
65*a1e26a70SApple OSS Distributions * Display i386 specific stats, fix incremental display, add
66*a1e26a70SApple OSS Distributions * explanatory block comment.
67*a1e26a70SApple OSS Distributions */
68*a1e26a70SApple OSS Distributions void usage(void);
69*a1e26a70SApple OSS Distributions void print_spin_hdr(void);
70*a1e26a70SApple OSS Distributions void print_spin(int requested, lockgroup_info_t *lockgroup);
71*a1e26a70SApple OSS Distributions void print_all_spin(lockgroup_info_t *lockgroup);
72*a1e26a70SApple OSS Distributions void print_mutex_hdr(void);
73*a1e26a70SApple OSS Distributions void print_mutex(int requested, lockgroup_info_t *lockgroup);
74*a1e26a70SApple OSS Distributions void print_all_mutex(lockgroup_info_t *lockgroup);
75*a1e26a70SApple OSS Distributions void print_rw_hdr(void);
76*a1e26a70SApple OSS Distributions void print_rw(int requested, lockgroup_info_t *lockgroup);
77*a1e26a70SApple OSS Distributions void print_all_rw(lockgroup_info_t *lockgroup);
78*a1e26a70SApple OSS Distributions void prime_lockgroup_deltas(void);
79*a1e26a70SApple OSS Distributions void get_lockgroup_deltas(void);
80*a1e26a70SApple OSS Distributions
81*a1e26a70SApple OSS Distributions char *pgmname;
82*a1e26a70SApple OSS Distributions mach_port_t host_control;
83*a1e26a70SApple OSS Distributions
84*a1e26a70SApple OSS Distributions lockgroup_info_t *lockgroup_info, *lockgroup_start, *lockgroup_deltas;
85*a1e26a70SApple OSS Distributions unsigned int count;
86*a1e26a70SApple OSS Distributions
87*a1e26a70SApple OSS Distributions unsigned int gDebug = 1;
88*a1e26a70SApple OSS Distributions
89*a1e26a70SApple OSS Distributions int
main(int argc,char ** argv)90*a1e26a70SApple OSS Distributions main(int argc, char **argv)
91*a1e26a70SApple OSS Distributions {
92*a1e26a70SApple OSS Distributions kern_return_t kr;
93*a1e26a70SApple OSS Distributions int arg2;
94*a1e26a70SApple OSS Distributions unsigned int i;
95*a1e26a70SApple OSS Distributions int found;
96*a1e26a70SApple OSS Distributions
97*a1e26a70SApple OSS Distributions setlinebuf(stdout);
98*a1e26a70SApple OSS Distributions
99*a1e26a70SApple OSS Distributions pgmname = argv[0];
100*a1e26a70SApple OSS Distributions gDebug = (NULL != strstr(argv[0], "debug"));
101*a1e26a70SApple OSS Distributions
102*a1e26a70SApple OSS Distributions host_control = mach_host_self();
103*a1e26a70SApple OSS Distributions
104*a1e26a70SApple OSS Distributions kr = host_lockgroup_info(host_control, &lockgroup_info, &count);
105*a1e26a70SApple OSS Distributions
106*a1e26a70SApple OSS Distributions if (kr != KERN_SUCCESS) {
107*a1e26a70SApple OSS Distributions mach_error("host_statistics", kr);
108*a1e26a70SApple OSS Distributions exit(EXIT_FAILURE);
109*a1e26a70SApple OSS Distributions }
110*a1e26a70SApple OSS Distributions if (gDebug) {
111*a1e26a70SApple OSS Distributions printf("count = %d\n", count);
112*a1e26a70SApple OSS Distributions for (i = 0; i < count; i++) {
113*a1e26a70SApple OSS Distributions printf("%s\n", lockgroup_info[i].lockgroup_name);
114*a1e26a70SApple OSS Distributions }
115*a1e26a70SApple OSS Distributions }
116*a1e26a70SApple OSS Distributions
117*a1e26a70SApple OSS Distributions switch (argc) {
118*a1e26a70SApple OSS Distributions case 2:
119*a1e26a70SApple OSS Distributions if (strcmp(argv[1], "all") == 0) {
120*a1e26a70SApple OSS Distributions print_spin_hdr();
121*a1e26a70SApple OSS Distributions print_all_spin(lockgroup_info);
122*a1e26a70SApple OSS Distributions print_mutex_hdr();
123*a1e26a70SApple OSS Distributions print_all_mutex(lockgroup_info);
124*a1e26a70SApple OSS Distributions print_rw_hdr();
125*a1e26a70SApple OSS Distributions print_all_rw(lockgroup_info);
126*a1e26a70SApple OSS Distributions } else if (strcmp(argv[1], "spin") == 0) {
127*a1e26a70SApple OSS Distributions print_spin_hdr();
128*a1e26a70SApple OSS Distributions print_all_spin(lockgroup_info);
129*a1e26a70SApple OSS Distributions } else if (strcmp(argv[1], "mutex") == 0) {
130*a1e26a70SApple OSS Distributions print_mutex_hdr();
131*a1e26a70SApple OSS Distributions print_all_mutex(lockgroup_info);
132*a1e26a70SApple OSS Distributions } else if (strcmp(argv[1], "rw") == 0) {
133*a1e26a70SApple OSS Distributions print_rw_hdr();
134*a1e26a70SApple OSS Distributions print_all_rw(lockgroup_info);
135*a1e26a70SApple OSS Distributions } else {
136*a1e26a70SApple OSS Distributions found = 0;
137*a1e26a70SApple OSS Distributions for (i = 0; i < count; i++) {
138*a1e26a70SApple OSS Distributions if (strcmp(argv[1], lockgroup_info[i].lockgroup_name) == 0) {
139*a1e26a70SApple OSS Distributions found = 1;
140*a1e26a70SApple OSS Distributions print_spin_hdr();
141*a1e26a70SApple OSS Distributions print_spin(i, lockgroup_info);
142*a1e26a70SApple OSS Distributions print_mutex_hdr();
143*a1e26a70SApple OSS Distributions print_mutex(i, lockgroup_info);
144*a1e26a70SApple OSS Distributions print_rw_hdr();
145*a1e26a70SApple OSS Distributions print_rw(i, lockgroup_info);
146*a1e26a70SApple OSS Distributions break;
147*a1e26a70SApple OSS Distributions }
148*a1e26a70SApple OSS Distributions }
149*a1e26a70SApple OSS Distributions if (found == 0) {
150*a1e26a70SApple OSS Distributions usage();
151*a1e26a70SApple OSS Distributions }
152*a1e26a70SApple OSS Distributions }
153*a1e26a70SApple OSS Distributions break;
154*a1e26a70SApple OSS Distributions case 3:
155*a1e26a70SApple OSS Distributions if (sscanf(argv[2], "%d", &arg2) != 1) {
156*a1e26a70SApple OSS Distributions usage();
157*a1e26a70SApple OSS Distributions }
158*a1e26a70SApple OSS Distributions if (arg2 < 0) {
159*a1e26a70SApple OSS Distributions usage();
160*a1e26a70SApple OSS Distributions }
161*a1e26a70SApple OSS Distributions prime_lockgroup_deltas();
162*a1e26a70SApple OSS Distributions if (strcmp(argv[1], "all") == 0) {
163*a1e26a70SApple OSS Distributions while (1) {
164*a1e26a70SApple OSS Distributions sleep(arg2);
165*a1e26a70SApple OSS Distributions get_lockgroup_deltas();
166*a1e26a70SApple OSS Distributions print_spin_hdr();
167*a1e26a70SApple OSS Distributions print_all_spin(lockgroup_deltas);
168*a1e26a70SApple OSS Distributions print_mutex_hdr();
169*a1e26a70SApple OSS Distributions print_all_mutex(lockgroup_deltas);
170*a1e26a70SApple OSS Distributions print_rw_hdr();
171*a1e26a70SApple OSS Distributions print_all_rw(lockgroup_deltas);
172*a1e26a70SApple OSS Distributions }
173*a1e26a70SApple OSS Distributions } else if (strcmp(argv[1], "spin") == 0) {
174*a1e26a70SApple OSS Distributions while (1) {
175*a1e26a70SApple OSS Distributions sleep(arg2);
176*a1e26a70SApple OSS Distributions get_lockgroup_deltas();
177*a1e26a70SApple OSS Distributions print_spin_hdr();
178*a1e26a70SApple OSS Distributions print_all_spin(lockgroup_deltas);
179*a1e26a70SApple OSS Distributions }
180*a1e26a70SApple OSS Distributions } else if (strcmp(argv[1], "mutex") == 0) {
181*a1e26a70SApple OSS Distributions while (1) {
182*a1e26a70SApple OSS Distributions sleep(arg2);
183*a1e26a70SApple OSS Distributions get_lockgroup_deltas();
184*a1e26a70SApple OSS Distributions print_mutex_hdr();
185*a1e26a70SApple OSS Distributions print_all_mutex(lockgroup_deltas);
186*a1e26a70SApple OSS Distributions }
187*a1e26a70SApple OSS Distributions } else if (strcmp(argv[1], "rw") == 0) {
188*a1e26a70SApple OSS Distributions while (1) {
189*a1e26a70SApple OSS Distributions sleep(arg2);
190*a1e26a70SApple OSS Distributions get_lockgroup_deltas();
191*a1e26a70SApple OSS Distributions print_rw_hdr();
192*a1e26a70SApple OSS Distributions print_all_rw(lockgroup_deltas);
193*a1e26a70SApple OSS Distributions }
194*a1e26a70SApple OSS Distributions } else {
195*a1e26a70SApple OSS Distributions found = 0;
196*a1e26a70SApple OSS Distributions for (i = 0; i < count; i++) {
197*a1e26a70SApple OSS Distributions if (strcmp(argv[1], lockgroup_info[i].lockgroup_name) == 0) {
198*a1e26a70SApple OSS Distributions found = 1;
199*a1e26a70SApple OSS Distributions while (1) {
200*a1e26a70SApple OSS Distributions sleep(arg2);
201*a1e26a70SApple OSS Distributions get_lockgroup_deltas();
202*a1e26a70SApple OSS Distributions print_spin_hdr();
203*a1e26a70SApple OSS Distributions print_spin(i, lockgroup_deltas);
204*a1e26a70SApple OSS Distributions print_mutex_hdr();
205*a1e26a70SApple OSS Distributions print_mutex(i, lockgroup_deltas);
206*a1e26a70SApple OSS Distributions print_rw_hdr();
207*a1e26a70SApple OSS Distributions print_rw(i, lockgroup_deltas);
208*a1e26a70SApple OSS Distributions }
209*a1e26a70SApple OSS Distributions }
210*a1e26a70SApple OSS Distributions }
211*a1e26a70SApple OSS Distributions if (found == 0) {
212*a1e26a70SApple OSS Distributions usage();
213*a1e26a70SApple OSS Distributions }
214*a1e26a70SApple OSS Distributions }
215*a1e26a70SApple OSS Distributions break;
216*a1e26a70SApple OSS Distributions case 4:
217*a1e26a70SApple OSS Distributions if (strcmp(argv[3], "abs") != 0) {
218*a1e26a70SApple OSS Distributions usage();
219*a1e26a70SApple OSS Distributions }
220*a1e26a70SApple OSS Distributions if (sscanf(argv[2], "%d", &arg2) != 1) {
221*a1e26a70SApple OSS Distributions usage();
222*a1e26a70SApple OSS Distributions }
223*a1e26a70SApple OSS Distributions if (strcmp(argv[1], "all") == 0) {
224*a1e26a70SApple OSS Distributions while (1) {
225*a1e26a70SApple OSS Distributions print_spin_hdr();
226*a1e26a70SApple OSS Distributions print_all_spin(lockgroup_info);
227*a1e26a70SApple OSS Distributions print_mutex_hdr();
228*a1e26a70SApple OSS Distributions print_all_mutex(lockgroup_info);
229*a1e26a70SApple OSS Distributions print_rw_hdr();
230*a1e26a70SApple OSS Distributions print_all_rw(lockgroup_info);
231*a1e26a70SApple OSS Distributions sleep(arg2);
232*a1e26a70SApple OSS Distributions }
233*a1e26a70SApple OSS Distributions } else if (strcmp(argv[1], "spin") == 0) {
234*a1e26a70SApple OSS Distributions while (1) {
235*a1e26a70SApple OSS Distributions print_all_spin(lockgroup_info);
236*a1e26a70SApple OSS Distributions sleep(arg2);
237*a1e26a70SApple OSS Distributions }
238*a1e26a70SApple OSS Distributions } else if (strcmp(argv[1], "mutex") == 0) {
239*a1e26a70SApple OSS Distributions print_mutex_hdr();
240*a1e26a70SApple OSS Distributions while (1) {
241*a1e26a70SApple OSS Distributions print_all_mutex(lockgroup_info);
242*a1e26a70SApple OSS Distributions sleep(arg2);
243*a1e26a70SApple OSS Distributions }
244*a1e26a70SApple OSS Distributions } else if (strcmp(argv[1], "rw") == 0) {
245*a1e26a70SApple OSS Distributions print_rw_hdr();
246*a1e26a70SApple OSS Distributions while (1) {
247*a1e26a70SApple OSS Distributions print_all_rw(lockgroup_info);
248*a1e26a70SApple OSS Distributions sleep(arg2);
249*a1e26a70SApple OSS Distributions }
250*a1e26a70SApple OSS Distributions } else {
251*a1e26a70SApple OSS Distributions found = 0;
252*a1e26a70SApple OSS Distributions for (i = 0; i < count; i++) {
253*a1e26a70SApple OSS Distributions if (strcmp(argv[1], lockgroup_info[i].lockgroup_name) == 0) {
254*a1e26a70SApple OSS Distributions found = 1;
255*a1e26a70SApple OSS Distributions while (1) {
256*a1e26a70SApple OSS Distributions print_spin_hdr();
257*a1e26a70SApple OSS Distributions print_spin(i, lockgroup_info);
258*a1e26a70SApple OSS Distributions print_mutex_hdr();
259*a1e26a70SApple OSS Distributions print_mutex(i, lockgroup_info);
260*a1e26a70SApple OSS Distributions print_rw_hdr();
261*a1e26a70SApple OSS Distributions print_rw(i, lockgroup_info);
262*a1e26a70SApple OSS Distributions sleep(arg2);
263*a1e26a70SApple OSS Distributions }
264*a1e26a70SApple OSS Distributions }
265*a1e26a70SApple OSS Distributions }
266*a1e26a70SApple OSS Distributions if (found == 0) {
267*a1e26a70SApple OSS Distributions usage();
268*a1e26a70SApple OSS Distributions }
269*a1e26a70SApple OSS Distributions }
270*a1e26a70SApple OSS Distributions break;
271*a1e26a70SApple OSS Distributions default:
272*a1e26a70SApple OSS Distributions usage();
273*a1e26a70SApple OSS Distributions break;
274*a1e26a70SApple OSS Distributions }
275*a1e26a70SApple OSS Distributions
276*a1e26a70SApple OSS Distributions exit(0);
277*a1e26a70SApple OSS Distributions }
278*a1e26a70SApple OSS Distributions
279*a1e26a70SApple OSS Distributions void
usage()280*a1e26a70SApple OSS Distributions usage()
281*a1e26a70SApple OSS Distributions {
282*a1e26a70SApple OSS Distributions fprintf(stderr, "Usage: %s [all, spin, mutex, rw, <lock group name>] {<repeat interval>} {abs}\n", pgmname);
283*a1e26a70SApple OSS Distributions exit(EXIT_FAILURE);
284*a1e26a70SApple OSS Distributions }
285*a1e26a70SApple OSS Distributions
286*a1e26a70SApple OSS Distributions void
print_spin_hdr(void)287*a1e26a70SApple OSS Distributions print_spin_hdr(void)
288*a1e26a70SApple OSS Distributions {
289*a1e26a70SApple OSS Distributions printf(" Spinlock acquires misses Name\n");
290*a1e26a70SApple OSS Distributions }
291*a1e26a70SApple OSS Distributions
292*a1e26a70SApple OSS Distributions void
print_spin(int requested,lockgroup_info_t * lockgroup)293*a1e26a70SApple OSS Distributions print_spin(int requested, lockgroup_info_t *lockgroup)
294*a1e26a70SApple OSS Distributions {
295*a1e26a70SApple OSS Distributions lockgroup_info_t *curptr = &lockgroup[requested];
296*a1e26a70SApple OSS Distributions
297*a1e26a70SApple OSS Distributions if (curptr->lock_spin_cnt != 0 && curptr->lock_spin_util_cnt != 0) {
298*a1e26a70SApple OSS Distributions printf("%16lld ", curptr->lock_spin_util_cnt);
299*a1e26a70SApple OSS Distributions printf("%16lld ", curptr->lock_spin_miss_cnt);
300*a1e26a70SApple OSS Distributions printf("%-14s\n", curptr->lockgroup_name);
301*a1e26a70SApple OSS Distributions }
302*a1e26a70SApple OSS Distributions }
303*a1e26a70SApple OSS Distributions
304*a1e26a70SApple OSS Distributions void
print_all_spin(lockgroup_info_t * lockgroup)305*a1e26a70SApple OSS Distributions print_all_spin(lockgroup_info_t *lockgroup)
306*a1e26a70SApple OSS Distributions {
307*a1e26a70SApple OSS Distributions unsigned int i;
308*a1e26a70SApple OSS Distributions
309*a1e26a70SApple OSS Distributions for (i = 0; i < count; i++) {
310*a1e26a70SApple OSS Distributions print_spin(i, lockgroup);
311*a1e26a70SApple OSS Distributions }
312*a1e26a70SApple OSS Distributions printf("\n");
313*a1e26a70SApple OSS Distributions }
314*a1e26a70SApple OSS Distributions
315*a1e26a70SApple OSS Distributions void
print_mutex_hdr(void)316*a1e26a70SApple OSS Distributions print_mutex_hdr(void)
317*a1e26a70SApple OSS Distributions {
318*a1e26a70SApple OSS Distributions #if defined(__i386__) || defined(__x86_64__)
319*a1e26a70SApple OSS Distributions printf("Mutex lock attempts Misses Waits Direct Waits Name\n");
320*a1e26a70SApple OSS Distributions #else
321*a1e26a70SApple OSS Distributions printf(" mutex locks misses waits name\n");
322*a1e26a70SApple OSS Distributions #endif
323*a1e26a70SApple OSS Distributions }
324*a1e26a70SApple OSS Distributions
325*a1e26a70SApple OSS Distributions void
print_mutex(int requested,lockgroup_info_t * lockgroup)326*a1e26a70SApple OSS Distributions print_mutex(int requested, lockgroup_info_t *lockgroup)
327*a1e26a70SApple OSS Distributions {
328*a1e26a70SApple OSS Distributions lockgroup_info_t *curptr = &lockgroup[requested];
329*a1e26a70SApple OSS Distributions
330*a1e26a70SApple OSS Distributions if (curptr->lock_mtx_cnt != 0 && curptr->lock_mtx_util_cnt != 0) {
331*a1e26a70SApple OSS Distributions printf("%16lld ", curptr->lock_mtx_util_cnt);
332*a1e26a70SApple OSS Distributions #if defined(__i386__) || defined(__x86_64__)
333*a1e26a70SApple OSS Distributions printf("%10lld %10lld %10lld ", curptr->lock_mtx_miss_cnt, curptr->lock_mtx_wait_cnt, curptr->lock_mtx_held_cnt);
334*a1e26a70SApple OSS Distributions #else
335*a1e26a70SApple OSS Distributions printf("%16lld %16lld ", curptr->lock_mtx_miss_cnt, curptr->lock_mtx_wait_cnt);
336*a1e26a70SApple OSS Distributions #endif
337*a1e26a70SApple OSS Distributions printf("%-14s\n", curptr->lockgroup_name);
338*a1e26a70SApple OSS Distributions }
339*a1e26a70SApple OSS Distributions }
340*a1e26a70SApple OSS Distributions
341*a1e26a70SApple OSS Distributions void
print_all_mutex(lockgroup_info_t * lockgroup)342*a1e26a70SApple OSS Distributions print_all_mutex(lockgroup_info_t *lockgroup)
343*a1e26a70SApple OSS Distributions {
344*a1e26a70SApple OSS Distributions unsigned int i;
345*a1e26a70SApple OSS Distributions
346*a1e26a70SApple OSS Distributions for (i = 0; i < count; i++) {
347*a1e26a70SApple OSS Distributions print_mutex(i, lockgroup);
348*a1e26a70SApple OSS Distributions }
349*a1e26a70SApple OSS Distributions printf("\n");
350*a1e26a70SApple OSS Distributions }
351*a1e26a70SApple OSS Distributions
352*a1e26a70SApple OSS Distributions void
print_rw_hdr(void)353*a1e26a70SApple OSS Distributions print_rw_hdr(void)
354*a1e26a70SApple OSS Distributions {
355*a1e26a70SApple OSS Distributions printf(" RW locks Misses Waits Name\n");
356*a1e26a70SApple OSS Distributions }
357*a1e26a70SApple OSS Distributions
358*a1e26a70SApple OSS Distributions void
print_rw(int requested,lockgroup_info_t * lockgroup)359*a1e26a70SApple OSS Distributions print_rw(int requested, lockgroup_info_t *lockgroup)
360*a1e26a70SApple OSS Distributions {
361*a1e26a70SApple OSS Distributions lockgroup_info_t *curptr = &lockgroup[requested];
362*a1e26a70SApple OSS Distributions
363*a1e26a70SApple OSS Distributions if (curptr->lock_rw_cnt != 0 && curptr->lock_rw_util_cnt != 0) {
364*a1e26a70SApple OSS Distributions printf("%16lld ", curptr->lock_rw_util_cnt);
365*a1e26a70SApple OSS Distributions printf("%16lld %16lld ", curptr->lock_rw_miss_cnt, curptr->lock_rw_wait_cnt);
366*a1e26a70SApple OSS Distributions printf("%-14s\n", curptr->lockgroup_name);
367*a1e26a70SApple OSS Distributions }
368*a1e26a70SApple OSS Distributions }
369*a1e26a70SApple OSS Distributions
370*a1e26a70SApple OSS Distributions void
print_all_rw(lockgroup_info_t * lockgroup)371*a1e26a70SApple OSS Distributions print_all_rw(lockgroup_info_t *lockgroup)
372*a1e26a70SApple OSS Distributions {
373*a1e26a70SApple OSS Distributions unsigned int i;
374*a1e26a70SApple OSS Distributions
375*a1e26a70SApple OSS Distributions for (i = 0; i < count; i++) {
376*a1e26a70SApple OSS Distributions print_rw(i, lockgroup);
377*a1e26a70SApple OSS Distributions }
378*a1e26a70SApple OSS Distributions printf("\n");
379*a1e26a70SApple OSS Distributions }
380*a1e26a70SApple OSS Distributions
381*a1e26a70SApple OSS Distributions void
prime_lockgroup_deltas(void)382*a1e26a70SApple OSS Distributions prime_lockgroup_deltas(void)
383*a1e26a70SApple OSS Distributions {
384*a1e26a70SApple OSS Distributions lockgroup_start = calloc(count, sizeof(lockgroup_info_t));
385*a1e26a70SApple OSS Distributions if (lockgroup_start == NULL) {
386*a1e26a70SApple OSS Distributions fprintf(stderr, "Can't allocate memory for lockgroup info\n");
387*a1e26a70SApple OSS Distributions exit(EXIT_FAILURE);
388*a1e26a70SApple OSS Distributions }
389*a1e26a70SApple OSS Distributions memcpy(lockgroup_start, lockgroup_info, count * sizeof(lockgroup_info_t));
390*a1e26a70SApple OSS Distributions
391*a1e26a70SApple OSS Distributions lockgroup_deltas = calloc(count, sizeof(lockgroup_info_t));
392*a1e26a70SApple OSS Distributions if (lockgroup_deltas == NULL) {
393*a1e26a70SApple OSS Distributions fprintf(stderr, "Can't allocate memory for lockgroup info\n");
394*a1e26a70SApple OSS Distributions exit(EXIT_FAILURE);
395*a1e26a70SApple OSS Distributions }
396*a1e26a70SApple OSS Distributions }
397*a1e26a70SApple OSS Distributions
398*a1e26a70SApple OSS Distributions void
get_lockgroup_deltas(void)399*a1e26a70SApple OSS Distributions get_lockgroup_deltas(void)
400*a1e26a70SApple OSS Distributions {
401*a1e26a70SApple OSS Distributions kern_return_t kr;
402*a1e26a70SApple OSS Distributions unsigned int i;
403*a1e26a70SApple OSS Distributions
404*a1e26a70SApple OSS Distributions kr = host_lockgroup_info(host_control, &lockgroup_info, &count);
405*a1e26a70SApple OSS Distributions
406*a1e26a70SApple OSS Distributions if (kr != KERN_SUCCESS) {
407*a1e26a70SApple OSS Distributions mach_error("host_statistics", kr);
408*a1e26a70SApple OSS Distributions exit(EXIT_FAILURE);
409*a1e26a70SApple OSS Distributions }
410*a1e26a70SApple OSS Distributions
411*a1e26a70SApple OSS Distributions memcpy(lockgroup_deltas, lockgroup_info, count * sizeof(lockgroup_info_t));
412*a1e26a70SApple OSS Distributions for (i = 0; i < count; i++) {
413*a1e26a70SApple OSS Distributions lockgroup_deltas[i].lock_spin_util_cnt =
414*a1e26a70SApple OSS Distributions lockgroup_info[i].lock_spin_util_cnt -
415*a1e26a70SApple OSS Distributions lockgroup_start[i].lock_spin_util_cnt;
416*a1e26a70SApple OSS Distributions lockgroup_deltas[i].lock_spin_miss_cnt =
417*a1e26a70SApple OSS Distributions lockgroup_info[i].lock_spin_miss_cnt -
418*a1e26a70SApple OSS Distributions lockgroup_start[i].lock_spin_miss_cnt;
419*a1e26a70SApple OSS Distributions lockgroup_deltas[i].lock_mtx_util_cnt =
420*a1e26a70SApple OSS Distributions lockgroup_info[i].lock_mtx_util_cnt -
421*a1e26a70SApple OSS Distributions lockgroup_start[i].lock_mtx_util_cnt;
422*a1e26a70SApple OSS Distributions lockgroup_deltas[i].lock_mtx_miss_cnt =
423*a1e26a70SApple OSS Distributions lockgroup_info[i].lock_mtx_miss_cnt -
424*a1e26a70SApple OSS Distributions lockgroup_start[i].lock_mtx_miss_cnt;
425*a1e26a70SApple OSS Distributions lockgroup_deltas[i].lock_mtx_wait_cnt =
426*a1e26a70SApple OSS Distributions lockgroup_info[i].lock_mtx_wait_cnt -
427*a1e26a70SApple OSS Distributions lockgroup_start[i].lock_mtx_wait_cnt;
428*a1e26a70SApple OSS Distributions lockgroup_deltas[i].lock_mtx_held_cnt =
429*a1e26a70SApple OSS Distributions lockgroup_info[i].lock_mtx_held_cnt -
430*a1e26a70SApple OSS Distributions lockgroup_start[i].lock_mtx_held_cnt;
431*a1e26a70SApple OSS Distributions lockgroup_deltas[i].lock_rw_util_cnt =
432*a1e26a70SApple OSS Distributions lockgroup_info[i].lock_rw_util_cnt -
433*a1e26a70SApple OSS Distributions lockgroup_start[i].lock_rw_util_cnt;
434*a1e26a70SApple OSS Distributions lockgroup_deltas[i].lock_rw_miss_cnt =
435*a1e26a70SApple OSS Distributions lockgroup_info[i].lock_rw_miss_cnt -
436*a1e26a70SApple OSS Distributions lockgroup_start[i].lock_rw_miss_cnt;
437*a1e26a70SApple OSS Distributions lockgroup_deltas[i].lock_rw_wait_cnt =
438*a1e26a70SApple OSS Distributions lockgroup_info[i].lock_rw_wait_cnt -
439*a1e26a70SApple OSS Distributions lockgroup_start[i].lock_rw_wait_cnt;
440*a1e26a70SApple OSS Distributions }
441*a1e26a70SApple OSS Distributions memcpy(lockgroup_start, lockgroup_info, count * sizeof(lockgroup_info_t));
442*a1e26a70SApple OSS Distributions }
443