File: | src/usr.bin/systat/vmstat.c |
Warning: | line 354, column 7 Although the value stored to 'intcnt' is used in the enclosing expression, the value is never actually read from 'intcnt' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* $OpenBSD: vmstat.c,v 1.96 2022/12/28 20:49:05 cheloha Exp $ */ |
2 | /* $NetBSD: vmstat.c,v 1.5 1996/05/10 23:16:40 thorpej Exp $ */ |
3 | |
4 | /*- |
5 | * Copyright (c) 1983, 1989, 1992, 1993 |
6 | * The Regents of the University of California. All rights reserved. |
7 | * |
8 | * Redistribution and use in source and binary forms, with or without |
9 | * modification, are permitted provided that the following conditions |
10 | * are met: |
11 | * 1. Redistributions of source code must retain the above copyright |
12 | * notice, this list of conditions and the following disclaimer. |
13 | * 2. Redistributions in binary form must reproduce the above copyright |
14 | * notice, this list of conditions and the following disclaimer in the |
15 | * documentation and/or other materials provided with the distribution. |
16 | * 3. Neither the name of the University nor the names of its contributors |
17 | * may be used to endorse or promote products derived from this software |
18 | * without specific prior written permission. |
19 | * |
20 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
21 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
22 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
23 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
24 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
25 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
26 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
27 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
28 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
29 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
30 | * SUCH DAMAGE. |
31 | */ |
32 | |
33 | /* |
34 | * Cursed vmstat -- from Robert Elz. |
35 | */ |
36 | |
37 | #include <sys/types.h> |
38 | #include <sys/namei.h> |
39 | #include <sys/signal.h> |
40 | #include <sys/proc.h> |
41 | #include <sys/sched.h> |
42 | #include <sys/stat.h> |
43 | #include <sys/sysctl.h> |
44 | #include <sys/time.h> |
45 | #include <sys/vmmeter.h> |
46 | |
47 | #include <ctype.h> |
48 | #include <errno(*__errno()).h> |
49 | #include <err.h> |
50 | #include <paths.h> |
51 | #include <signal.h> |
52 | #include <stdlib.h> |
53 | #include <string.h> |
54 | #include <unistd.h> |
55 | |
56 | #include "systat.h" |
57 | #include "dkstats.h" |
58 | |
59 | #define MAXIMUM(a, b)(((a) > (b)) ? (a) : (b)) (((a) > (b)) ? (a) : (b)) |
60 | #define MINIMUM(a, b)(((a) < (b)) ? (a) : (b)) (((a) < (b)) ? (a) : (b)) |
61 | #define nitems(_a)(sizeof((_a)) / sizeof((_a)[0])) (sizeof((_a)) / sizeof((_a)[0])) |
62 | |
63 | static struct Info { |
64 | struct cpustats cpustats; |
65 | struct uvmexp uvmexp; |
66 | struct vmtotal Total; |
67 | struct nchstats nchstats; |
68 | long nchcount; |
69 | uint64_t *intrcnt; |
70 | } s, s1, s2, s3, z; |
71 | |
72 | static int ncpu; |
73 | |
74 | extern struct _disk cur; |
75 | |
76 | #define cnts.Cnt s.Cnt |
77 | #define oldcnts1.Cnt s1.Cnt |
78 | #define totals.Total s.Total |
79 | #define nchtotals.nchstats s.nchstats |
80 | #define oldnchtotals1.nchstats s1.nchstats |
81 | |
82 | static enum state { BOOT, TIME, RUN } state = TIME; |
83 | |
84 | static void allocinfo(struct Info *); |
85 | static void copyinfo(struct Info *, struct Info *); |
86 | static float cputime(int); |
87 | static void dinfo(int, int, double); |
88 | static void getinfo(struct Info *); |
89 | void putint(int, int, int, int); |
90 | void putintmk(int, int, int, int); |
91 | void putuint64(u_int64_t, int, int, int); |
92 | void putfloat(double, int, int, int, int, int); |
93 | int ucount(void); |
94 | |
95 | void print_vm(void); |
96 | int read_vm(void); |
97 | int select_vm(void); |
98 | int vm_keyboard_callback(int); |
99 | |
100 | static time_t t; |
101 | static int nintr; |
102 | static long *intrloc; |
103 | static char **intrname; |
104 | static int ipktsrow; |
105 | |
106 | WINDOW * |
107 | openkre(void) |
108 | { |
109 | return (subwin(stdscr, LINES-1-1, 0, 1, 0)); |
110 | } |
111 | |
112 | void |
113 | closekre(WINDOW *w) |
114 | { |
115 | |
116 | if (w == NULL((void *)0)) |
117 | return; |
118 | wclear(w); |
119 | wrefresh(w); |
120 | delwin(w); |
121 | } |
122 | |
123 | /* |
124 | * These constants define where the major pieces are laid out |
125 | */ |
126 | #define STATROW0 0 /* uses 1 row and 68 cols */ |
127 | #define STATCOL2 2 |
128 | #define MEMROW2 2 /* uses 4 rows and 34 cols */ |
129 | #define MEMCOL0 0 |
130 | #define PAGEROW2 2 /* uses 4 rows and 26 cols */ |
131 | #define PAGECOL37 37 |
132 | #define INTSROW2 2 /* uses all rows to bottom and 17 cols */ |
133 | #define INTSCOL63 63 |
134 | #define PROCSROW7 7 /* uses 2 rows and 20 cols */ |
135 | #define PROCSCOL0 0 |
136 | #define GENSTATROW7 7 /* uses 2 rows and 35 cols */ |
137 | #define GENSTATCOL16 16 |
138 | #define VMSTATROW7 7 /* uses 18 rows and 12 cols */ |
139 | #define VMSTATCOL48 48 |
140 | #define GRAPHROW10 10 /* uses 3 rows and 51 cols */ |
141 | #define GRAPHCOL0 0 |
142 | #define NAMEIROW14 14 /* uses 3 rows and 49 cols */ |
143 | #define NAMEICOL0 0 |
144 | #define DISKROW18 18 /* uses 5 rows and 50 cols (for 9 drives) */ |
145 | #define DISKCOL0 0 |
146 | |
147 | #define DRIVESPACE45 45 /* max space for drives */ |
148 | |
149 | |
150 | field_def *view_vm_0[] = { |
151 | NULL((void *)0) |
152 | }; |
153 | |
154 | /* Define view managers */ |
155 | struct view_manager vmstat_mgr = { |
156 | "VMstat", select_vm, read_vm, NULL((void *)0), print_header, |
157 | print_vm, vm_keyboard_callback, NULL((void *)0), NULL((void *)0) |
158 | }; |
159 | |
160 | field_view views_vm[] = { |
161 | {view_vm_0, "vmstat", '7', &vmstat_mgr}, |
162 | {NULL((void *)0), NULL((void *)0), 0, NULL((void *)0)} |
163 | }; |
164 | |
165 | int |
166 | initvmstat(void) |
167 | { |
168 | field_view *v; |
169 | int mib[4], i; |
170 | size_t size; |
171 | |
172 | if (!dkinit(1)) |
173 | return(0); |
174 | |
175 | mib[0] = CTL_HW6; |
176 | mib[1] = HW_NCPU3; |
177 | size = sizeof(ncpu); |
178 | if (sysctl(mib, 2, &ncpu, &size, NULL((void *)0), 0) == -1) |
179 | return (-1); |
180 | |
181 | mib[0] = CTL_KERN1; |
182 | mib[1] = KERN_INTRCNT63; |
183 | mib[2] = KERN_INTRCNT_NUM1; |
184 | size = sizeof(nintr); |
185 | if (sysctl(mib, 3, &nintr, &size, NULL((void *)0), 0) == -1) |
186 | return (-1); |
187 | |
188 | intrloc = calloc(nintr, sizeof(long)); |
189 | intrname = calloc(nintr, sizeof(char *)); |
190 | if (intrloc == NULL((void *)0) || intrname == NULL((void *)0)) |
191 | err(2, NULL((void *)0)); |
192 | |
193 | for (i = 0; i < nintr; i++) { |
194 | char name[128]; |
195 | |
196 | mib[0] = CTL_KERN1; |
197 | mib[1] = KERN_INTRCNT63; |
198 | mib[2] = KERN_INTRCNT_NAME3; |
199 | mib[3] = i; |
200 | size = sizeof(name); |
201 | if (sysctl(mib, 4, name, &size, NULL((void *)0), 0) == -1) |
202 | return (-1); |
203 | |
204 | intrname[i] = strdup(name); |
205 | if (intrname[i] == NULL((void *)0)) |
206 | return (-1); |
207 | } |
208 | |
209 | allocinfo(&s); |
210 | allocinfo(&s1); |
211 | allocinfo(&s2); |
212 | allocinfo(&s3); |
213 | allocinfo(&z); |
214 | |
215 | getinfo(&s2); |
216 | copyinfo(&z, &s1); |
217 | |
218 | for (v = views_vm; v->name != NULL((void *)0); v++) |
219 | add_view(v); |
220 | |
221 | return(1); |
222 | } |
223 | |
224 | void |
225 | fetchkre(void) |
226 | { |
227 | getinfo(&s3); |
228 | } |
229 | |
230 | void |
231 | labelkre(void) |
232 | { |
233 | int i, j, l; |
234 | |
235 | mvprintw(MEMROW2, MEMCOL0, " memory totals (in KB)"); |
236 | mvprintw(MEMROW2 + 1, MEMCOL0, " real virtual free"); |
237 | mvprintw(MEMROW2 + 2, MEMCOL0, "Active"); |
238 | mvprintw(MEMROW2 + 3, MEMCOL0, "All"); |
239 | |
240 | mvprintw(PAGEROW2, PAGECOL37, " PAGING SWAPPING "); |
241 | mvprintw(PAGEROW2 + 1, PAGECOL37, " in out in out "); |
242 | mvprintw(PAGEROW2 + 2, PAGECOL37, "ops"); |
243 | mvprintw(PAGEROW2 + 3, PAGECOL37, "pages"); |
244 | |
245 | mvprintw(INTSROW2, INTSCOL63 + 3, " Interrupts"); |
246 | mvprintw(INTSROW2 + 1, INTSCOL63 + 9, "total"); |
247 | |
248 | j = INTSROW2 + 2; |
249 | for (i = 0; i < nintr; i++) { |
250 | intrloc[i] = 0; |
251 | if (s.intrcnt[i] == 0 || ipktsrow == LINES) |
252 | continue; |
253 | intrloc[i] = j++; |
254 | mvprintw(intrloc[i], INTSCOL63 + 9, "%-8.8s", intrname[i]); |
255 | } |
256 | ipktsrow = MAXIMUM(j, MINIMUM(LINES - 3, VMSTATROW + 17))(((j) > ((((LINES - 3) < (7 + 17)) ? (LINES - 3) : (7 + 17)))) ? (j) : ((((LINES - 3) < (7 + 17)) ? (LINES - 3) : (7 + 17)))); |
257 | if (LINES - 1 > ipktsrow) |
258 | mvprintw(ipktsrow, INTSCOL63 + 9, "IPKTS"); |
259 | if (LINES - 1 > ipktsrow + 1) |
260 | mvprintw(ipktsrow + 1, INTSCOL63 + 9, "OPKTS"); |
261 | |
262 | mvprintw(VMSTATROW7 + 0, VMSTATCOL48 + 10, "forks"); |
263 | mvprintw(VMSTATROW7 + 1, VMSTATCOL48 + 10, "fkppw"); |
264 | mvprintw(VMSTATROW7 + 2, VMSTATCOL48 + 10, "fksvm"); |
265 | mvprintw(VMSTATROW7 + 3, VMSTATCOL48 + 10, "pwait"); |
266 | mvprintw(VMSTATROW7 + 4, VMSTATCOL48 + 10, "relck"); |
267 | mvprintw(VMSTATROW7 + 5, VMSTATCOL48 + 10, "rlkok"); |
268 | mvprintw(VMSTATROW7 + 6, VMSTATCOL48 + 10, "noram"); |
269 | mvprintw(VMSTATROW7 + 7, VMSTATCOL48 + 10, "ndcpy"); |
270 | mvprintw(VMSTATROW7 + 8, VMSTATCOL48 + 10, "fltcp"); |
271 | mvprintw(VMSTATROW7 + 9, VMSTATCOL48 + 10, "zfod"); |
272 | mvprintw(VMSTATROW7 + 10, VMSTATCOL48 + 10, "cow"); |
273 | mvprintw(VMSTATROW7 + 11, VMSTATCOL48 + 10, "fmin"); |
274 | mvprintw(VMSTATROW7 + 12, VMSTATCOL48 + 10, "ftarg"); |
275 | mvprintw(VMSTATROW7 + 13, VMSTATCOL48 + 10, "itarg"); |
276 | mvprintw(VMSTATROW7 + 14, VMSTATCOL48 + 10, "wired"); |
277 | mvprintw(VMSTATROW7 + 15, VMSTATCOL48 + 10, "pdfre"); |
278 | if (LINES - 1 > VMSTATROW7 + 16) |
279 | mvprintw(VMSTATROW7 + 16, VMSTATCOL48 + 10, "pdscn"); |
280 | if (LINES - 1 > VMSTATROW7 + 17) |
281 | mvprintw(VMSTATROW7 + 17, VMSTATCOL48 + 10, "pzidl"); |
282 | if (LINES - 1 > VMSTATROW7 + 18) |
283 | mvprintw(VMSTATROW7 + 18, VMSTATCOL48 + 10, "kmape"); |
284 | |
285 | mvprintw(GENSTATROW7, GENSTATCOL16, " Csw Trp Sys Int Sof Flt"); |
286 | |
287 | mvprintw(GRAPHROW10, GRAPHCOL0, |
288 | " . %%Int . %%Spn . %%Sys . %%Usr . %%Idle"); |
289 | mvprintw(PROCSROW7, PROCSCOL0, "Proc:r d s w"); |
290 | mvprintw(GRAPHROW10 + 1, GRAPHCOL0, |
291 | "| | | | | | | | | | |"); |
292 | |
293 | mvprintw(NAMEIROW14, NAMEICOL0, |
294 | "Namei Sys-cache Proc-cache No-cache"); |
295 | mvprintw(NAMEIROW14 + 1, NAMEICOL0, |
296 | " Calls hits %% hits %% miss %%"); |
297 | mvprintw(DISKROW18, DISKCOL0, "Disks"); |
298 | mvprintw(DISKROW18 + 1, DISKCOL0, "seeks"); |
299 | mvprintw(DISKROW18 + 2, DISKCOL0, "xfers"); |
300 | mvprintw(DISKROW18 + 3, DISKCOL0, "speed"); |
301 | mvprintw(DISKROW18 + 4, DISKCOL0, " sec"); |
302 | for (i = 0, j = 0; i < cur.dk_ndrive && j < DRIVESPACE45; i++) |
303 | if (cur.dk_select[i] && (j + strlen(dr_name[i])) < DRIVESPACE45) { |
304 | l = MAXIMUM(5, strlen(dr_name[i]))(((5) > (strlen(dr_name[i]))) ? (5) : (strlen(dr_name[i])) ); |
305 | mvprintw(DISKROW18, DISKCOL0 + 5 + j, |
306 | " %*s", l, dr_name[i]); |
307 | j += 1 + l; |
308 | } |
309 | for (i = 0; i < nintr; i++) { |
310 | if (intrloc[i] == 0) |
311 | continue; |
312 | mvprintw(intrloc[i], INTSCOL63 + 9, "%-8.8s", intrname[i]); |
313 | } |
314 | } |
315 | |
316 | #define X(fld){s.fld[i]-=s1.fld[i];} {s.fld[i]-=s1.fld[i];} |
317 | #define Y(fld){s.fld -= s1.fld;} {s.fld -= s1.fld;} |
318 | #define Z(fld){s.nchstats.fld -= s1.nchstats.fld;} {s.nchstats.fld -= s1.nchstats.fld;} |
319 | #define PUTRATE(fld, l, c, w)do { {s.fld -= s1.fld;}; putint((int)((float)s.fld/etime + 0.5 ), l, c, w); } while (0) \ |
320 | do { \ |
321 | Y(fld){s.fld -= s1.fld;}; \ |
322 | putint((int)((float)s.fld/etime + 0.5), l, c, w); \ |
323 | } while (0) |
324 | |
325 | static char cpuchar[] = { '|', '@', '=', '>', ' ' }; |
326 | static char cpuorder[] = { CP_INTR4, CP_SPIN3, CP_SYS2, CP_USER0, CP_IDLE5 }; |
327 | |
328 | void |
329 | showkre(void) |
330 | { |
331 | static struct timespec prev; |
332 | struct timespec elapsed, now; |
333 | float f1, f2; |
334 | int psiz; |
335 | u_int64_t inttotal, intcnt; |
336 | int i, l, c; |
337 | static int first_run = 0; |
338 | double etime; |
339 | |
340 | clock_gettime(CLOCK_UPTIME5, &now); |
341 | timespecsub(&now, &prev, &elapsed)do { (&elapsed)->tv_sec = (&now)->tv_sec - (& prev)->tv_sec; (&elapsed)->tv_nsec = (&now)-> tv_nsec - (&prev)->tv_nsec; if ((&elapsed)->tv_nsec < 0) { (&elapsed)->tv_sec--; (&elapsed)->tv_nsec += 1000000000L; } } while (0); |
342 | prev = now; |
343 | if (state == TIME) { |
344 | if (!first_run) { |
345 | first_run = 1; |
346 | return; |
347 | } |
348 | } |
349 | etime = elapsed.tv_sec + elapsed.tv_nsec / 1000000000.0; |
350 | for (i = 0; i < CPUSTATES6; i++) |
351 | X(cpustats.cs_time){s.cpustats.cs_time[i]-=s1.cpustats.cs_time[i];}; |
352 | inttotal = 0; |
353 | for (i = 0; i < nintr; i++) { |
354 | t = intcnt = s.intrcnt[i]; |
Although the value stored to 'intcnt' is used in the enclosing expression, the value is never actually read from 'intcnt' | |
355 | s.intrcnt[i] -= s1.intrcnt[i]; |
356 | intcnt = (u_int64_t)((float)s.intrcnt[i]/etime + 0.5); |
357 | inttotal += intcnt; |
358 | if (intrloc[i] != 0) |
359 | putuint64(intcnt, intrloc[i], INTSCOL63, 8); |
360 | } |
361 | putuint64(inttotal, INTSROW2 + 1, INTSCOL63, 8); |
362 | Z(ncs_goodhits){s.nchstats.ncs_goodhits -= s1.nchstats.ncs_goodhits;}; Z(ncs_badhits){s.nchstats.ncs_badhits -= s1.nchstats.ncs_badhits;}; Z(ncs_miss){s.nchstats.ncs_miss -= s1.nchstats.ncs_miss;}; |
363 | Z(ncs_long){s.nchstats.ncs_long -= s1.nchstats.ncs_long;}; Z(ncs_pass2){s.nchstats.ncs_pass2 -= s1.nchstats.ncs_pass2;}; Z(ncs_2passes){s.nchstats.ncs_2passes -= s1.nchstats.ncs_2passes;}; |
364 | s.nchcount = nchtotals.nchstats.ncs_goodhits + nchtotals.nchstats.ncs_badhits + |
365 | nchtotals.nchstats.ncs_miss + nchtotals.nchstats.ncs_long; |
366 | |
367 | if (LINES - 1 > ipktsrow) |
368 | putint(sum.ifc_ip, ipktsrow, INTSCOL63, 8); |
369 | if (LINES - 1 > ipktsrow + 1) |
370 | putint(sum.ifc_op, ipktsrow + 1, INTSCOL63, 8); |
371 | |
372 | psiz = 0; |
373 | f2 = 0.0; |
374 | |
375 | for (c = 0; c < nitems(cpuorder)(sizeof((cpuorder)) / sizeof((cpuorder)[0])); c++) { |
376 | i = cpuorder[c]; |
377 | f1 = cputime(i); |
378 | if (i == CP_USER0) |
379 | f1 += cputime(CP_NICE1); |
380 | f2 += f1; |
381 | l = (int) ((f2 + 1.0) / 2.0) - psiz; |
382 | putfloat(f1, GRAPHROW10, GRAPHCOL0 + 1 + (10 * c), 5, 1, 0); |
383 | move(GRAPHROW + 2, psiz)wmove(stdscr,(10 + 2),(psiz)); |
384 | psiz += l; |
385 | while (l-- > 0) |
386 | addch(cpuchar[c])waddch(stdscr,(cpuchar[c])); |
387 | } |
388 | |
389 | #define pgtokb(pg)((pg) * (s.uvmexp.pagesize / 1024)) ((pg) * (s.uvmexp.pagesize / 1024)) |
390 | |
391 | putint(pgtokb(s.uvmexp.active)((s.uvmexp.active) * (s.uvmexp.pagesize / 1024)), MEMROW2 + 2, MEMCOL0 + 7, 8); |
392 | putint(pgtokb(s.uvmexp.active + s.uvmexp.swpginuse)((s.uvmexp.active + s.uvmexp.swpginuse) * (s.uvmexp.pagesize / 1024)), /* XXX */ |
393 | MEMROW2 + 2, MEMCOL0 + 17, 8); |
394 | putint(pgtokb(s.uvmexp.npages - s.uvmexp.free)((s.uvmexp.npages - s.uvmexp.free) * (s.uvmexp.pagesize / 1024 )), MEMROW2 + 3, MEMCOL0 + 7, 8); |
395 | putint(pgtokb(s.uvmexp.npages - s.uvmexp.free + s.uvmexp.swpginuse)((s.uvmexp.npages - s.uvmexp.free + s.uvmexp.swpginuse) * (s. uvmexp.pagesize / 1024)), |
396 | MEMROW2 + 3, MEMCOL0 + 17, 8); |
397 | putint(pgtokb(s.uvmexp.free)((s.uvmexp.free) * (s.uvmexp.pagesize / 1024)), MEMROW2 + 2, MEMCOL0 + 26, 8); |
398 | putint(pgtokb(s.uvmexp.free + s.uvmexp.swpages - s.uvmexp.swpginuse)((s.uvmexp.free + s.uvmexp.swpages - s.uvmexp.swpginuse) * (s .uvmexp.pagesize / 1024)), |
399 | MEMROW2 + 3, MEMCOL0 + 26, 8); |
400 | putint(totals.Total.t_rq - 1, PROCSROW7 + 1, PROCSCOL0 + 3, 3); |
401 | |
402 | putint(totals.Total.t_dw, PROCSROW7 + 1, PROCSCOL0 + 6, 3); |
403 | putint(totals.Total.t_sl, PROCSROW7 + 1, PROCSCOL0 + 9, 3); |
404 | putint(totals.Total.t_sw, PROCSROW7 + 1, PROCSCOL0 + 12, 3); |
405 | PUTRATE(uvmexp.forks, VMSTATROW + 0, VMSTATCOL + 3, 6)do { {s.uvmexp.forks -= s1.uvmexp.forks;}; putint((int)((float )s.uvmexp.forks/etime + 0.5), 7 + 0, 48 + 3, 6); } while (0); |
406 | PUTRATE(uvmexp.forks_ppwait, VMSTATROW + 1, VMSTATCOL + 3, 6)do { {s.uvmexp.forks_ppwait -= s1.uvmexp.forks_ppwait;}; putint ((int)((float)s.uvmexp.forks_ppwait/etime + 0.5), 7 + 1, 48 + 3, 6); } while (0); |
407 | PUTRATE(uvmexp.forks_sharevm, VMSTATROW + 2, VMSTATCOL + 3, 6)do { {s.uvmexp.forks_sharevm -= s1.uvmexp.forks_sharevm;}; putint ((int)((float)s.uvmexp.forks_sharevm/etime + 0.5), 7 + 2, 48 + 3, 6); } while (0); |
408 | PUTRATE(uvmexp.fltpgwait, VMSTATROW + 3, VMSTATCOL + 4, 5)do { {s.uvmexp.fltpgwait -= s1.uvmexp.fltpgwait;}; putint((int )((float)s.uvmexp.fltpgwait/etime + 0.5), 7 + 3, 48 + 4, 5); } while (0); |
409 | PUTRATE(uvmexp.fltrelck, VMSTATROW + 4, VMSTATCOL + 3, 6)do { {s.uvmexp.fltrelck -= s1.uvmexp.fltrelck;}; putint((int) ((float)s.uvmexp.fltrelck/etime + 0.5), 7 + 4, 48 + 3, 6); } while (0); |
410 | PUTRATE(uvmexp.fltrelckok, VMSTATROW + 5, VMSTATCOL + 3, 6)do { {s.uvmexp.fltrelckok -= s1.uvmexp.fltrelckok;}; putint(( int)((float)s.uvmexp.fltrelckok/etime + 0.5), 7 + 5, 48 + 3, 6 ); } while (0); |
411 | PUTRATE(uvmexp.fltnoram, VMSTATROW + 6, VMSTATCOL + 3, 6)do { {s.uvmexp.fltnoram -= s1.uvmexp.fltnoram;}; putint((int) ((float)s.uvmexp.fltnoram/etime + 0.5), 7 + 6, 48 + 3, 6); } while (0); |
412 | PUTRATE(uvmexp.fltamcopy, VMSTATROW + 7, VMSTATCOL + 3, 6)do { {s.uvmexp.fltamcopy -= s1.uvmexp.fltamcopy;}; putint((int )((float)s.uvmexp.fltamcopy/etime + 0.5), 7 + 7, 48 + 3, 6); } while (0); |
413 | PUTRATE(uvmexp.flt_prcopy, VMSTATROW + 8, VMSTATCOL + 3, 6)do { {s.uvmexp.flt_prcopy -= s1.uvmexp.flt_prcopy;}; putint(( int)((float)s.uvmexp.flt_prcopy/etime + 0.5), 7 + 8, 48 + 3, 6 ); } while (0); |
414 | PUTRATE(uvmexp.flt_przero, VMSTATROW + 9, VMSTATCOL + 3, 6)do { {s.uvmexp.flt_przero -= s1.uvmexp.flt_przero;}; putint(( int)((float)s.uvmexp.flt_przero/etime + 0.5), 7 + 9, 48 + 3, 6 ); } while (0); |
415 | PUTRATE(uvmexp.flt_acow, VMSTATROW + 10, VMSTATCOL, 9)do { {s.uvmexp.flt_acow -= s1.uvmexp.flt_acow;}; putint((int) ((float)s.uvmexp.flt_acow/etime + 0.5), 7 + 10, 48, 9); } while (0); |
416 | putint(s.uvmexp.freemin, VMSTATROW7 + 11, VMSTATCOL48, 9); |
417 | putint(s.uvmexp.freetarg, VMSTATROW7 + 12, VMSTATCOL48, 9); |
418 | putint(s.uvmexp.inactarg, VMSTATROW7 + 13, VMSTATCOL48, 9); |
419 | putint(s.uvmexp.wired, VMSTATROW7 + 14, VMSTATCOL48, 9); |
420 | PUTRATE(uvmexp.pdfreed, VMSTATROW + 15, VMSTATCOL, 9)do { {s.uvmexp.pdfreed -= s1.uvmexp.pdfreed;}; putint((int)(( float)s.uvmexp.pdfreed/etime + 0.5), 7 + 15, 48, 9); } while ( 0); |
421 | if (LINES - 1 > VMSTATROW7 + 16) |
422 | PUTRATE(uvmexp.pdscans, VMSTATROW + 16, VMSTATCOL, 9)do { {s.uvmexp.pdscans -= s1.uvmexp.pdscans;}; putint((int)(( float)s.uvmexp.pdscans/etime + 0.5), 7 + 16, 48, 9); } while ( 0); |
423 | if (LINES - 1 > VMSTATROW7 + 17) |
424 | PUTRATE(uvmexp.zeropages, VMSTATROW + 17, VMSTATCOL, 9)do { {s.uvmexp.zeropages -= s1.uvmexp.zeropages;}; putint((int )((float)s.uvmexp.zeropages/etime + 0.5), 7 + 17, 48, 9); } while (0); |
425 | if (LINES - 1 > VMSTATROW7 + 18) |
426 | putint(s.uvmexp.kmapent, VMSTATROW7 + 18, VMSTATCOL48, 9); |
427 | |
428 | PUTRATE(uvmexp.pageins, PAGEROW + 2, PAGECOL + 5, 5)do { {s.uvmexp.pageins -= s1.uvmexp.pageins;}; putint((int)(( float)s.uvmexp.pageins/etime + 0.5), 2 + 2, 37 + 5, 5); } while (0); |
429 | PUTRATE(uvmexp.pdpageouts, PAGEROW + 2, PAGECOL + 10, 5)do { {s.uvmexp.pdpageouts -= s1.uvmexp.pdpageouts;}; putint(( int)((float)s.uvmexp.pdpageouts/etime + 0.5), 2 + 2, 37 + 10, 5); } while (0); |
430 | PUTRATE(uvmexp.pgswapin, PAGEROW + 3, PAGECOL + 5, 5)do { {s.uvmexp.pgswapin -= s1.uvmexp.pgswapin;}; putint((int) ((float)s.uvmexp.pgswapin/etime + 0.5), 2 + 3, 37 + 5, 5); } while (0); |
431 | PUTRATE(uvmexp.pgswapout, PAGEROW + 3, PAGECOL + 10, 5)do { {s.uvmexp.pgswapout -= s1.uvmexp.pgswapout;}; putint((int )((float)s.uvmexp.pgswapout/etime + 0.5), 2 + 3, 37 + 10, 5); } while (0); |
432 | |
433 | PUTRATE(uvmexp.swtch, GENSTATROW + 1, GENSTATCOL, 6)do { {s.uvmexp.swtch -= s1.uvmexp.swtch;}; putint((int)((float )s.uvmexp.swtch/etime + 0.5), 7 + 1, 16, 6); } while (0); |
434 | PUTRATE(uvmexp.traps, GENSTATROW + 1, GENSTATCOL + 6, 6)do { {s.uvmexp.traps -= s1.uvmexp.traps;}; putint((int)((float )s.uvmexp.traps/etime + 0.5), 7 + 1, 16 + 6, 6); } while (0); |
435 | PUTRATE(uvmexp.syscalls, GENSTATROW + 1, GENSTATCOL + 12, 6)do { {s.uvmexp.syscalls -= s1.uvmexp.syscalls;}; putint((int) ((float)s.uvmexp.syscalls/etime + 0.5), 7 + 1, 16 + 12, 6); } while (0); |
436 | PUTRATE(uvmexp.intrs, GENSTATROW + 1, GENSTATCOL + 18, 6)do { {s.uvmexp.intrs -= s1.uvmexp.intrs;}; putint((int)((float )s.uvmexp.intrs/etime + 0.5), 7 + 1, 16 + 18, 6); } while (0); |
437 | PUTRATE(uvmexp.softs, GENSTATROW + 1, GENSTATCOL + 24, 6)do { {s.uvmexp.softs -= s1.uvmexp.softs;}; putint((int)((float )s.uvmexp.softs/etime + 0.5), 7 + 1, 16 + 24, 6); } while (0); |
438 | PUTRATE(uvmexp.faults, GENSTATROW + 1, GENSTATCOL + 30, 5)do { {s.uvmexp.faults -= s1.uvmexp.faults;}; putint((int)((float )s.uvmexp.faults/etime + 0.5), 7 + 1, 16 + 30, 5); } while (0 ); |
439 | mvprintw(DISKROW18, DISKCOL0 + 5, " "); |
440 | for (i = 0, c = 0; i < cur.dk_ndrive && c < DRIVESPACE45; i++) |
441 | if (cur.dk_select[i] && (c + strlen(dr_name[i])) < DRIVESPACE45) { |
442 | l = MAXIMUM(5, strlen(dr_name[i]))(((5) > (strlen(dr_name[i]))) ? (5) : (strlen(dr_name[i])) ); |
443 | mvprintw(DISKROW18, DISKCOL0 + 5 + c, |
444 | " %*s", l, dr_name[i]); |
445 | c += 1 + l; |
446 | dinfo(i, c, etime); |
447 | } |
448 | /* and pad the DRIVESPACE */ |
449 | l = DRIVESPACE45 - c; |
450 | for (i = 0; i < 5; i++) |
451 | mvprintw(DISKROW18 + i, DISKCOL0 + 5 + c, "%*s", l, ""); |
452 | |
453 | putint(s.nchcount, NAMEIROW14 + 2, NAMEICOL0, 9); |
454 | putint(nchtotals.nchstats.ncs_goodhits, NAMEIROW14 + 2, NAMEICOL0 + 10, 8); |
455 | #define nz(x) ((x) ? (x) : 1) |
456 | putfloat(nchtotals.nchstats.ncs_goodhits * 100.0 / nz(s.nchcount), |
457 | NAMEIROW14 + 2, NAMEICOL0 + 19, 4, 0, 1); |
458 | putint(nchtotals.nchstats.ncs_pass2, NAMEIROW14 + 2, NAMEICOL0 + 24, 7); |
459 | putfloat(nchtotals.nchstats.ncs_pass2 * 100.0 / nz(s.nchcount), |
460 | NAMEIROW14 + 2, NAMEICOL0 + 33, 4, 0, 1); |
461 | putint(nchtotals.nchstats.ncs_miss + nchtotals.nchstats.ncs_long - nchtotals.nchstats.ncs_pass2, |
462 | NAMEIROW14 + 2, NAMEICOL0 + 38, 7); |
463 | putfloat((nchtotals.nchstats.ncs_miss + nchtotals.nchstats.ncs_long - nchtotals.nchstats.ncs_pass2) * |
464 | 100.0 / nz(s.nchcount), NAMEIROW14 + 2, NAMEICOL0 + 45, 4, 0, 1); |
465 | #undef nz |
466 | |
467 | } |
468 | |
469 | int |
470 | vm_keyboard_callback(int ch) |
471 | { |
472 | switch(ch) { |
473 | case 'r': |
474 | copyinfo(&s2, &s1); |
475 | state = RUN; |
476 | break; |
477 | case 'b': |
478 | state = BOOT; |
479 | copyinfo(&z, &s1); |
480 | break; |
481 | case 't': |
482 | state = TIME; |
483 | break; |
484 | case 'z': |
485 | if (state == RUN) |
486 | getinfo(&s1); |
487 | break; |
488 | } |
489 | return (keyboard_callback(ch)); |
490 | } |
491 | |
492 | |
493 | static float |
494 | cputime(int indx) |
495 | { |
496 | double tm; |
497 | int i; |
498 | |
499 | tm = 0; |
500 | for (i = 0; i < nitems(s.cpustats.cs_time)(sizeof((s.cpustats.cs_time)) / sizeof((s.cpustats.cs_time)[0 ])); i++) |
501 | tm += s.cpustats.cs_time[i]; |
502 | if (tm == 0.0) |
503 | tm = 1.0; |
504 | return (s.cpustats.cs_time[indx] * 100.0 / tm); |
505 | } |
506 | |
507 | void |
508 | putint(int n, int l, int c, int w) |
509 | { |
510 | char b[128]; |
511 | |
512 | move(l, c)wmove(stdscr,(l),(c)); |
513 | if (n == 0) { |
514 | while (w-- > 0) |
515 | addch(' ')waddch(stdscr,(' ')); |
516 | return; |
517 | } |
518 | snprintf(b, sizeof b, "%*d", w, n); |
519 | if (strlen(b) > w) { |
520 | while (w-- > 0) |
521 | addch('*')waddch(stdscr,('*')); |
522 | return; |
523 | } |
524 | addstr(b)waddnstr(stdscr,(b),-1); |
525 | } |
526 | |
527 | void |
528 | putintmk(int n, int l, int c, int w) |
529 | { |
530 | char b[128]; |
531 | |
532 | move(l, c)wmove(stdscr,(l),(c)); |
533 | if (n == 0) { |
534 | while (w-- > 0) |
535 | addch(' ')waddch(stdscr,(' ')); |
536 | return; |
537 | } |
538 | if (n > 9999 * 1024) |
539 | snprintf(b, sizeof b, "%*dG", w - 1, n / 1024 / 1024); |
540 | else if (n > 9999) |
541 | snprintf(b, sizeof b, "%*dM", w - 1, n / 1024); |
542 | else |
543 | snprintf(b, sizeof b, "%*dK", w - 1, n); |
544 | if (strlen(b) > w) { |
545 | while (w-- > 0) |
546 | addch('*')waddch(stdscr,('*')); |
547 | return; |
548 | } |
549 | addstr(b)waddnstr(stdscr,(b),-1); |
550 | } |
551 | |
552 | void |
553 | putuint64(u_int64_t n, int l, int c, int w) |
554 | { |
555 | char b[128]; |
556 | |
557 | move(l, c)wmove(stdscr,(l),(c)); |
558 | if (n == 0) { |
559 | while (w-- > 0) |
560 | addch(' ')waddch(stdscr,(' ')); |
561 | return; |
562 | } |
563 | snprintf(b, sizeof b, "%*llu", w, n); |
564 | if (strlen(b) > w) { |
565 | while (w-- > 0) |
566 | addch('*')waddch(stdscr,('*')); |
567 | return; |
568 | } |
569 | addstr(b)waddnstr(stdscr,(b),-1); |
570 | } |
571 | |
572 | void |
573 | putfloat(double f, int l, int c, int w, int d, int nz) |
574 | { |
575 | char b[128]; |
576 | |
577 | move(l, c)wmove(stdscr,(l),(c)); |
578 | if (nz && f == 0.0) { |
579 | while (--w >= 0) |
580 | addch(' ')waddch(stdscr,(' ')); |
581 | return; |
582 | } |
583 | snprintf(b, sizeof b, "%*.*f", w, d, f); |
584 | if (strlen(b) > w) { |
585 | while (--w >= 0) |
586 | addch('*')waddch(stdscr,('*')); |
587 | return; |
588 | } |
589 | addstr(b)waddnstr(stdscr,(b),-1); |
590 | } |
591 | |
592 | static void |
593 | getinfo(struct Info *si) |
594 | { |
595 | static int cpustats_mib[3] = { CTL_KERN1, KERN_CPUSTATS85, 0 }; |
596 | static int nchstats_mib[2] = { CTL_KERN1, KERN_NCHSTATS41 }; |
597 | static int uvmexp_mib[2] = { CTL_VM2, VM_UVMEXP4 }; |
598 | static int vmtotal_mib[2] = { CTL_VM2, VM_METER1 }; |
599 | struct cpustats cs; |
600 | int mib[4], i, j; |
601 | size_t size; |
602 | |
603 | dkreadstats(); |
604 | |
605 | for (i = 0; i < nintr; i++) { |
606 | mib[0] = CTL_KERN1; |
607 | mib[1] = KERN_INTRCNT63; |
608 | mib[2] = KERN_INTRCNT_CNT2; |
609 | mib[3] = i; |
610 | size = sizeof(si->intrcnt[i]); |
611 | if (sysctl(mib, 4, &si->intrcnt[i], &size, NULL((void *)0), 0) == -1) { |
612 | si->intrcnt[i] = 0; |
613 | } |
614 | } |
615 | |
616 | memset(&si->cpustats.cs_time, 0, sizeof(si->cpustats.cs_time)); |
617 | for (i = 0; i < ncpu; i++) { |
618 | cpustats_mib[2] = i; |
619 | size = sizeof(cs); |
620 | if (sysctl(cpustats_mib, 3, &cs, &size, NULL((void *)0), 0) == -1) { |
621 | error("Can't get KERN_CPUSTATS: %s\n", strerror(errno(*__errno()))); |
622 | memset(&si->cpustats, 0, sizeof(si->cpustats)); |
623 | } |
624 | if ((cs.cs_flags & CPUSTATS_ONLINE0x0001) == 0) |
625 | continue; /* omit totals for offline CPUs */ |
626 | for (j = 0; j < nitems(cs.cs_time)(sizeof((cs.cs_time)) / sizeof((cs.cs_time)[0])); j++) |
627 | si->cpustats.cs_time[j] += cs.cs_time[j]; |
628 | } |
629 | |
630 | size = sizeof(si->nchstats); |
631 | if (sysctl(nchstats_mib, 2, &si->nchstats, &size, NULL((void *)0), 0) == -1) { |
632 | error("Can't get KERN_NCHSTATS: %s\n", strerror(errno(*__errno()))); |
633 | memset(&si->nchstats, 0, sizeof(si->nchstats)); |
634 | } |
635 | |
636 | size = sizeof(si->uvmexp); |
637 | if (sysctl(uvmexp_mib, 2, &si->uvmexp, &size, NULL((void *)0), 0) == -1) { |
638 | error("Can't get VM_UVMEXP: %s\n", strerror(errno(*__errno()))); |
639 | memset(&si->uvmexp, 0, sizeof(si->uvmexp)); |
640 | } |
641 | |
642 | size = sizeof(si->Total); |
643 | if (sysctl(vmtotal_mib, 2, &si->Total, &size, NULL((void *)0), 0) == -1) { |
644 | error("Can't get VM_METER: %s\n", strerror(errno(*__errno()))); |
645 | memset(&si->Total, 0, sizeof(si->Total)); |
646 | } |
647 | } |
648 | |
649 | static void |
650 | allocinfo(struct Info *si) |
651 | { |
652 | memset(si, 0, sizeof(*si)); |
653 | si->intrcnt = calloc(nintr, sizeof(*si->intrcnt)); |
654 | if (si->intrcnt == NULL((void *)0)) |
655 | err(2, NULL((void *)0)); |
656 | } |
657 | |
658 | static void |
659 | copyinfo(struct Info *from, struct Info *to) |
660 | { |
661 | uint64_t *intrcnt; |
662 | |
663 | intrcnt = to->intrcnt; |
664 | *to = *from; |
665 | memcpy(to->intrcnt = intrcnt, from->intrcnt, nintr * sizeof(*intrcnt)); |
666 | } |
667 | |
668 | static void |
669 | dinfo(int dn, int c, double etime) |
670 | { |
671 | double words, atime; |
672 | |
673 | c += DISKCOL0; |
674 | |
675 | /* time busy in disk activity */ |
676 | atime = (double)cur.dk_time[dn].tv_sec + |
677 | ((double)cur.dk_time[dn].tv_usec / (double)1000000); |
678 | |
679 | /* # of K transferred */ |
680 | words = (cur.dk_rbytes[dn] + cur.dk_wbytes[dn]) / 1024.0; |
681 | |
682 | putint((int)((float)cur.dk_seek[dn]/etime+0.5), DISKROW18 + 1, c, 5); |
683 | putint((int)((float)(cur.dk_rxfer[dn] + cur.dk_wxfer[dn])/etime+0.5), |
684 | DISKROW18 + 2, c, 5); |
685 | putintmk((int)(words/etime + 0.5), DISKROW18 + 3, c, 5); |
686 | putfloat(atime/etime, DISKROW18 + 4, c, 5, 1, 1); |
687 | } |
688 | |
689 | |
690 | |
691 | int |
692 | select_vm(void) |
693 | { |
694 | num_disp = 0; |
695 | return (0); |
696 | } |
697 | |
698 | int |
699 | read_vm(void) |
700 | { |
701 | if (state == TIME) |
702 | copyinfo(&s3, &s1); |
703 | fetchkre(); |
704 | fetchifstat(); |
705 | if (state == TIME) |
706 | dkswap(); |
707 | num_disp = 0; |
708 | return 0; |
709 | } |
710 | |
711 | |
712 | void |
713 | print_vm(void) |
714 | { |
715 | copyinfo(&s3, &s); |
716 | labelkre(); |
717 | showkre(); |
718 | } |