| File: | src/usr.bin/systat/vmstat.c |
| Warning: | line 362, 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.91 2019/06/28 13:35:04 deraadt 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/param.h> /* MAXCOMLEN */ |
| 38 | #include <sys/types.h> |
| 39 | #include <sys/namei.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 | |
| 62 | static struct Info { |
| 63 | struct cpustats cpustats; |
| 64 | struct uvmexp uvmexp; |
| 65 | struct vmtotal Total; |
| 66 | struct nchstats nchstats; |
| 67 | long nchcount; |
| 68 | uint64_t *intrcnt; |
| 69 | } s, s1, s2, s3, z; |
| 70 | |
| 71 | static int ncpu; |
| 72 | |
| 73 | extern struct _disk cur; |
| 74 | |
| 75 | #define cnts.Cnt s.Cnt |
| 76 | #define oldcnts1.Cnt s1.Cnt |
| 77 | #define totals.Total s.Total |
| 78 | #define nchtotals.nchstats s.nchstats |
| 79 | #define oldnchtotals1.nchstats s1.nchstats |
| 80 | |
| 81 | static enum state { BOOT, TIME, RUN } state = TIME; |
| 82 | |
| 83 | static void allocinfo(struct Info *); |
| 84 | static void copyinfo(struct Info *, struct Info *); |
| 85 | static float cputime(int); |
| 86 | static void dinfo(int, int); |
| 87 | static void getinfo(struct Info *); |
| 88 | void putint(int, int, int, int); |
| 89 | void putintmk(int, int, int, int); |
| 90 | void putuint64(u_int64_t, int, int, int); |
| 91 | void putfloat(double, int, int, int, int, int); |
| 92 | int ucount(void); |
| 93 | |
| 94 | void print_vm(void); |
| 95 | int read_vm(void); |
| 96 | int select_vm(void); |
| 97 | int vm_keyboard_callback(int); |
| 98 | |
| 99 | static time_t t; |
| 100 | static float hertz; |
| 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 | hertz = stathz; |
| 173 | if (!dkinit(1)) |
| 174 | return(0); |
| 175 | |
| 176 | mib[0] = CTL_HW6; |
| 177 | mib[1] = HW_NCPU3; |
| 178 | size = sizeof(ncpu); |
| 179 | if (sysctl(mib, 2, &ncpu, &size, NULL((void *)0), 0) == -1) |
| 180 | return (-1); |
| 181 | |
| 182 | mib[0] = CTL_KERN1; |
| 183 | mib[1] = KERN_INTRCNT63; |
| 184 | mib[2] = KERN_INTRCNT_NUM1; |
| 185 | size = sizeof(nintr); |
| 186 | if (sysctl(mib, 3, &nintr, &size, NULL((void *)0), 0) == -1) |
| 187 | return (-1); |
| 188 | |
| 189 | intrloc = calloc(nintr, sizeof(long)); |
| 190 | intrname = calloc(nintr, sizeof(char *)); |
| 191 | if (intrloc == NULL((void *)0) || intrname == NULL((void *)0)) |
| 192 | err(2, NULL((void *)0)); |
| 193 | |
| 194 | for (i = 0; i < nintr; i++) { |
| 195 | char name[128]; |
| 196 | |
| 197 | mib[0] = CTL_KERN1; |
| 198 | mib[1] = KERN_INTRCNT63; |
| 199 | mib[2] = KERN_INTRCNT_NAME3; |
| 200 | mib[3] = i; |
| 201 | size = sizeof(name); |
| 202 | if (sysctl(mib, 4, name, &size, NULL((void *)0), 0) == -1) |
| 203 | return (-1); |
| 204 | |
| 205 | intrname[i] = strdup(name); |
| 206 | if (intrname[i] == NULL((void *)0)) |
| 207 | return (-1); |
| 208 | } |
| 209 | |
| 210 | allocinfo(&s); |
| 211 | allocinfo(&s1); |
| 212 | allocinfo(&s2); |
| 213 | allocinfo(&s3); |
| 214 | allocinfo(&z); |
| 215 | |
| 216 | getinfo(&s2); |
| 217 | copyinfo(&z, &s1); |
| 218 | |
| 219 | for (v = views_vm; v->name != NULL((void *)0); v++) |
| 220 | add_view(v); |
| 221 | |
| 222 | return(1); |
| 223 | } |
| 224 | |
| 225 | void |
| 226 | fetchkre(void) |
| 227 | { |
| 228 | getinfo(&s3); |
| 229 | } |
| 230 | |
| 231 | void |
| 232 | labelkre(void) |
| 233 | { |
| 234 | int i, j, l; |
| 235 | |
| 236 | mvprintw(MEMROW2, MEMCOL0, " memory totals (in KB)"); |
| 237 | mvprintw(MEMROW2 + 1, MEMCOL0, " real virtual free"); |
| 238 | mvprintw(MEMROW2 + 2, MEMCOL0, "Active"); |
| 239 | mvprintw(MEMROW2 + 3, MEMCOL0, "All"); |
| 240 | |
| 241 | mvprintw(PAGEROW2, PAGECOL37, " PAGING SWAPPING "); |
| 242 | mvprintw(PAGEROW2 + 1, PAGECOL37, " in out in out "); |
| 243 | mvprintw(PAGEROW2 + 2, PAGECOL37, "ops"); |
| 244 | mvprintw(PAGEROW2 + 3, PAGECOL37, "pages"); |
| 245 | |
| 246 | mvprintw(INTSROW2, INTSCOL63 + 3, " Interrupts"); |
| 247 | mvprintw(INTSROW2 + 1, INTSCOL63 + 9, "total"); |
| 248 | |
| 249 | j = INTSROW2 + 2; |
| 250 | for (i = 0; i < nintr; i++) { |
| 251 | intrloc[i] = 0; |
| 252 | if (s.intrcnt[i] == 0 || ipktsrow == LINES) |
| 253 | continue; |
| 254 | intrloc[i] = j++; |
| 255 | mvprintw(intrloc[i], INTSCOL63 + 9, "%-8.8s", intrname[i]); |
| 256 | } |
| 257 | 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)))); |
| 258 | if (LINES - 1 > ipktsrow) |
| 259 | mvprintw(ipktsrow, INTSCOL63 + 9, "IPKTS"); |
| 260 | if (LINES - 1 > ipktsrow + 1) |
| 261 | mvprintw(ipktsrow + 1, INTSCOL63 + 9, "OPKTS"); |
| 262 | |
| 263 | mvprintw(VMSTATROW7 + 0, VMSTATCOL48 + 10, "forks"); |
| 264 | mvprintw(VMSTATROW7 + 1, VMSTATCOL48 + 10, "fkppw"); |
| 265 | mvprintw(VMSTATROW7 + 2, VMSTATCOL48 + 10, "fksvm"); |
| 266 | mvprintw(VMSTATROW7 + 3, VMSTATCOL48 + 10, "pwait"); |
| 267 | mvprintw(VMSTATROW7 + 4, VMSTATCOL48 + 10, "relck"); |
| 268 | mvprintw(VMSTATROW7 + 5, VMSTATCOL48 + 10, "rlkok"); |
| 269 | mvprintw(VMSTATROW7 + 6, VMSTATCOL48 + 10, "noram"); |
| 270 | mvprintw(VMSTATROW7 + 7, VMSTATCOL48 + 10, "ndcpy"); |
| 271 | mvprintw(VMSTATROW7 + 8, VMSTATCOL48 + 10, "fltcp"); |
| 272 | mvprintw(VMSTATROW7 + 9, VMSTATCOL48 + 10, "zfod"); |
| 273 | mvprintw(VMSTATROW7 + 10, VMSTATCOL48 + 10, "cow"); |
| 274 | mvprintw(VMSTATROW7 + 11, VMSTATCOL48 + 10, "fmin"); |
| 275 | mvprintw(VMSTATROW7 + 12, VMSTATCOL48 + 10, "ftarg"); |
| 276 | mvprintw(VMSTATROW7 + 13, VMSTATCOL48 + 10, "itarg"); |
| 277 | mvprintw(VMSTATROW7 + 14, VMSTATCOL48 + 10, "wired"); |
| 278 | mvprintw(VMSTATROW7 + 15, VMSTATCOL48 + 10, "pdfre"); |
| 279 | if (LINES - 1 > VMSTATROW7 + 16) |
| 280 | mvprintw(VMSTATROW7 + 16, VMSTATCOL48 + 10, "pdscn"); |
| 281 | if (LINES - 1 > VMSTATROW7 + 17) |
| 282 | mvprintw(VMSTATROW7 + 17, VMSTATCOL48 + 10, "pzidl"); |
| 283 | if (LINES - 1 > VMSTATROW7 + 18) |
| 284 | mvprintw(VMSTATROW7 + 18, VMSTATCOL48 + 10, "kmape"); |
| 285 | |
| 286 | mvprintw(GENSTATROW7, GENSTATCOL16, " Csw Trp Sys Int Sof Flt"); |
| 287 | |
| 288 | mvprintw(GRAPHROW10, GRAPHCOL0, |
| 289 | " . %%Int . %%Spn . %%Sys . %%Usr . %%Idle"); |
| 290 | mvprintw(PROCSROW7, PROCSCOL0, "Proc:r d s w"); |
| 291 | mvprintw(GRAPHROW10 + 1, GRAPHCOL0, |
| 292 | "| | | | | | | | | | |"); |
| 293 | |
| 294 | mvprintw(NAMEIROW14, NAMEICOL0, |
| 295 | "Namei Sys-cache Proc-cache No-cache"); |
| 296 | mvprintw(NAMEIROW14 + 1, NAMEICOL0, |
| 297 | " Calls hits %% hits %% miss %%"); |
| 298 | mvprintw(DISKROW18, DISKCOL0, "Disks"); |
| 299 | mvprintw(DISKROW18 + 1, DISKCOL0, "seeks"); |
| 300 | mvprintw(DISKROW18 + 2, DISKCOL0, "xfers"); |
| 301 | mvprintw(DISKROW18 + 3, DISKCOL0, "speed"); |
| 302 | mvprintw(DISKROW18 + 4, DISKCOL0, " sec"); |
| 303 | for (i = 0, j = 0; i < cur.dk_ndrive && j < DRIVESPACE45; i++) |
| 304 | if (cur.dk_select[i] && (j + strlen(dr_name[i])) < DRIVESPACE45) { |
| 305 | l = MAXIMUM(5, strlen(dr_name[i]))(((5) > (strlen(dr_name[i]))) ? (5) : (strlen(dr_name[i])) ); |
| 306 | mvprintw(DISKROW18, DISKCOL0 + 5 + j, |
| 307 | " %*s", l, dr_name[i]); |
| 308 | j += 1 + l; |
| 309 | } |
| 310 | for (i = 0; i < nintr; i++) { |
| 311 | if (intrloc[i] == 0) |
| 312 | continue; |
| 313 | mvprintw(intrloc[i], INTSCOL63 + 9, "%-8.8s", intrname[i]); |
| 314 | } |
| 315 | } |
| 316 | |
| 317 | #define X(fld){s.fld[i]-=s1.fld[i];} {s.fld[i]-=s1.fld[i];} |
| 318 | #define Y(fld){s.fld -= s1.fld;} {s.fld -= s1.fld;} |
| 319 | #define Z(fld){s.nchstats.fld -= s1.nchstats.fld;} {s.nchstats.fld -= s1.nchstats.fld;} |
| 320 | #define PUTRATE(fld, l, c, w)do { {s.fld -= s1.fld;}; putint((int)((float)s.fld/etime + 0.5 ), l, c, w); } while (0) \ |
| 321 | do { \ |
| 322 | Y(fld){s.fld -= s1.fld;}; \ |
| 323 | putint((int)((float)s.fld/etime + 0.5), l, c, w); \ |
| 324 | } while (0) |
| 325 | #define MAXFAIL5 5 |
| 326 | |
| 327 | static char cpuchar[] = { '|', '@', '=', '>', ' ' }; |
| 328 | static char cpuorder[] = { CP_INTR4, CP_SPIN3, CP_SYS2, CP_USER0, CP_IDLE5 }; |
| 329 | |
| 330 | void |
| 331 | showkre(void) |
| 332 | { |
| 333 | float f1, f2; |
| 334 | int psiz; |
| 335 | u_int64_t inttotal, intcnt; |
| 336 | int i, l, c; |
| 337 | static int failcnt = 0, first_run = 0; |
| 338 | double etime; |
| 339 | |
| 340 | if (state == TIME) { |
| 341 | if (!first_run) { |
| 342 | first_run = 1; |
| 343 | return; |
| 344 | } |
| 345 | } |
| 346 | etime = 0; |
| 347 | for (i = 0; i < CPUSTATES6; i++) { |
| 348 | X(cpustats.cs_time){s.cpustats.cs_time[i]-=s1.cpustats.cs_time[i];}; |
| 349 | etime += s.cpustats.cs_time[i]; |
| 350 | } |
| 351 | if (etime < 5.0) { /* < 5 ticks - ignore this trash */ |
| 352 | if (failcnt++ >= MAXFAIL5) { |
| 353 | error("The alternate system clock has died!"); |
| 354 | failcnt = 0; |
| 355 | } |
| 356 | return; |
| 357 | } |
| 358 | failcnt = 0; |
| 359 | etime /= hertz; |
| 360 | inttotal = 0; |
| 361 | for (i = 0; i < nintr; i++) { |
| 362 | 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' | |
| 363 | s.intrcnt[i] -= s1.intrcnt[i]; |
| 364 | intcnt = (u_int64_t)((float)s.intrcnt[i]/etime + 0.5); |
| 365 | inttotal += intcnt; |
| 366 | if (intrloc[i] != 0) |
| 367 | putuint64(intcnt, intrloc[i], INTSCOL63, 8); |
| 368 | } |
| 369 | putuint64(inttotal, INTSROW2 + 1, INTSCOL63, 8); |
| 370 | 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;}; |
| 371 | 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;}; |
| 372 | s.nchcount = nchtotals.nchstats.ncs_goodhits + nchtotals.nchstats.ncs_badhits + |
| 373 | nchtotals.nchstats.ncs_miss + nchtotals.nchstats.ncs_long; |
| 374 | |
| 375 | if (LINES - 1 > ipktsrow) |
| 376 | putint(sum.ifc_ip, ipktsrow, INTSCOL63, 8); |
| 377 | if (LINES - 1 > ipktsrow + 1) |
| 378 | putint(sum.ifc_op, ipktsrow + 1, INTSCOL63, 8); |
| 379 | |
| 380 | psiz = 0; |
| 381 | f2 = 0.0; |
| 382 | |
| 383 | for (c = 0; c < nitems(cpuorder)(sizeof((cpuorder)) / sizeof((cpuorder)[0])); c++) { |
| 384 | i = cpuorder[c]; |
| 385 | f1 = cputime(i); |
| 386 | if (i == CP_USER0) |
| 387 | f1 += cputime(CP_NICE1); |
| 388 | f2 += f1; |
| 389 | l = (int) ((f2 + 1.0) / 2.0) - psiz; |
| 390 | putfloat(f1, GRAPHROW10, GRAPHCOL0 + 1 + (10 * c), 5, 1, 0); |
| 391 | move(GRAPHROW + 2, psiz)wmove(stdscr,10 + 2,psiz); |
| 392 | psiz += l; |
| 393 | while (l-- > 0) |
| 394 | addch(cpuchar[c])waddch(stdscr,cpuchar[c]); |
| 395 | } |
| 396 | |
| 397 | #define pgtokb(pg)((pg) * (s.uvmexp.pagesize / 1024)) ((pg) * (s.uvmexp.pagesize / 1024)) |
| 398 | |
| 399 | putint(pgtokb(s.uvmexp.active)((s.uvmexp.active) * (s.uvmexp.pagesize / 1024)), MEMROW2 + 2, MEMCOL0 + 7, 8); |
| 400 | putint(pgtokb(s.uvmexp.active + s.uvmexp.swpginuse)((s.uvmexp.active + s.uvmexp.swpginuse) * (s.uvmexp.pagesize / 1024)), /* XXX */ |
| 401 | MEMROW2 + 2, MEMCOL0 + 17, 8); |
| 402 | putint(pgtokb(s.uvmexp.npages - s.uvmexp.free)((s.uvmexp.npages - s.uvmexp.free) * (s.uvmexp.pagesize / 1024 )), MEMROW2 + 3, MEMCOL0 + 7, 8); |
| 403 | putint(pgtokb(s.uvmexp.npages - s.uvmexp.free + s.uvmexp.swpginuse)((s.uvmexp.npages - s.uvmexp.free + s.uvmexp.swpginuse) * (s. uvmexp.pagesize / 1024)), |
| 404 | MEMROW2 + 3, MEMCOL0 + 17, 8); |
| 405 | putint(pgtokb(s.uvmexp.free)((s.uvmexp.free) * (s.uvmexp.pagesize / 1024)), MEMROW2 + 2, MEMCOL0 + 26, 8); |
| 406 | putint(pgtokb(s.uvmexp.free + s.uvmexp.swpages - s.uvmexp.swpginuse)((s.uvmexp.free + s.uvmexp.swpages - s.uvmexp.swpginuse) * (s .uvmexp.pagesize / 1024)), |
| 407 | MEMROW2 + 3, MEMCOL0 + 26, 8); |
| 408 | putint(totals.Total.t_rq - 1, PROCSROW7 + 1, PROCSCOL0 + 3, 3); |
| 409 | |
| 410 | putint(totals.Total.t_dw, PROCSROW7 + 1, PROCSCOL0 + 6, 3); |
| 411 | putint(totals.Total.t_sl, PROCSROW7 + 1, PROCSCOL0 + 9, 3); |
| 412 | putint(totals.Total.t_sw, PROCSROW7 + 1, PROCSCOL0 + 12, 3); |
| 413 | 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); |
| 414 | 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); |
| 415 | 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); |
| 416 | 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); |
| 417 | 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); |
| 418 | 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); |
| 419 | 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); |
| 420 | 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); |
| 421 | 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); |
| 422 | 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); |
| 423 | 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); |
| 424 | putint(s.uvmexp.freemin, VMSTATROW7 + 11, VMSTATCOL48, 9); |
| 425 | putint(s.uvmexp.freetarg, VMSTATROW7 + 12, VMSTATCOL48, 9); |
| 426 | putint(s.uvmexp.inactarg, VMSTATROW7 + 13, VMSTATCOL48, 9); |
| 427 | putint(s.uvmexp.wired, VMSTATROW7 + 14, VMSTATCOL48, 9); |
| 428 | 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); |
| 429 | if (LINES - 1 > VMSTATROW7 + 16) |
| 430 | 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); |
| 431 | if (LINES - 1 > VMSTATROW7 + 17) |
| 432 | 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); |
| 433 | if (LINES - 1 > VMSTATROW7 + 18) |
| 434 | putint(s.uvmexp.kmapent, VMSTATROW7 + 18, VMSTATCOL48, 9); |
| 435 | |
| 436 | 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); |
| 437 | 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); |
| 438 | 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); |
| 439 | 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); |
| 440 | |
| 441 | 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); |
| 442 | 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); |
| 443 | 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); |
| 444 | 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); |
| 445 | 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); |
| 446 | 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 ); |
| 447 | mvprintw(DISKROW18, DISKCOL0 + 5, " "); |
| 448 | for (i = 0, c = 0; i < cur.dk_ndrive && c < DRIVESPACE45; i++) |
| 449 | if (cur.dk_select[i] && (c + strlen(dr_name[i])) < DRIVESPACE45) { |
| 450 | l = MAXIMUM(5, strlen(dr_name[i]))(((5) > (strlen(dr_name[i]))) ? (5) : (strlen(dr_name[i])) ); |
| 451 | mvprintw(DISKROW18, DISKCOL0 + 5 + c, |
| 452 | " %*s", l, dr_name[i]); |
| 453 | c += 1 + l; |
| 454 | dinfo(i, c); |
| 455 | } |
| 456 | /* and pad the DRIVESPACE */ |
| 457 | l = DRIVESPACE45 - c; |
| 458 | for (i = 0; i < 5; i++) |
| 459 | mvprintw(DISKROW18 + i, DISKCOL0 + 5 + c, "%*s", l, ""); |
| 460 | |
| 461 | putint(s.nchcount, NAMEIROW14 + 2, NAMEICOL0, 9); |
| 462 | putint(nchtotals.nchstats.ncs_goodhits, NAMEIROW14 + 2, NAMEICOL0 + 10, 8); |
| 463 | #define nz(x) ((x) ? (x) : 1) |
| 464 | putfloat(nchtotals.nchstats.ncs_goodhits * 100.0 / nz(s.nchcount), |
| 465 | NAMEIROW14 + 2, NAMEICOL0 + 19, 4, 0, 1); |
| 466 | putint(nchtotals.nchstats.ncs_pass2, NAMEIROW14 + 2, NAMEICOL0 + 24, 7); |
| 467 | putfloat(nchtotals.nchstats.ncs_pass2 * 100.0 / nz(s.nchcount), |
| 468 | NAMEIROW14 + 2, NAMEICOL0 + 33, 4, 0, 1); |
| 469 | putint(nchtotals.nchstats.ncs_miss + nchtotals.nchstats.ncs_long - nchtotals.nchstats.ncs_pass2, |
| 470 | NAMEIROW14 + 2, NAMEICOL0 + 38, 7); |
| 471 | putfloat((nchtotals.nchstats.ncs_miss + nchtotals.nchstats.ncs_long - nchtotals.nchstats.ncs_pass2) * |
| 472 | 100.0 / nz(s.nchcount), NAMEIROW14 + 2, NAMEICOL0 + 45, 4, 0, 1); |
| 473 | #undef nz |
| 474 | |
| 475 | } |
| 476 | |
| 477 | int |
| 478 | vm_keyboard_callback(int ch) |
| 479 | { |
| 480 | switch(ch) { |
| 481 | case 'r': |
| 482 | copyinfo(&s2, &s1); |
| 483 | state = RUN; |
| 484 | break; |
| 485 | case 'b': |
| 486 | state = BOOT; |
| 487 | copyinfo(&z, &s1); |
| 488 | break; |
| 489 | case 't': |
| 490 | state = TIME; |
| 491 | break; |
| 492 | case 'z': |
| 493 | if (state == RUN) |
| 494 | getinfo(&s1); |
| 495 | break; |
| 496 | } |
| 497 | return (keyboard_callback(ch)); |
| 498 | } |
| 499 | |
| 500 | |
| 501 | static float |
| 502 | cputime(int indx) |
| 503 | { |
| 504 | double tm; |
| 505 | int i; |
| 506 | |
| 507 | tm = 0; |
| 508 | for (i = 0; i < nitems(s.cpustats.cs_time)(sizeof((s.cpustats.cs_time)) / sizeof((s.cpustats.cs_time)[0 ])); i++) |
| 509 | tm += s.cpustats.cs_time[i]; |
| 510 | if (tm == 0.0) |
| 511 | tm = 1.0; |
| 512 | return (s.cpustats.cs_time[indx] * 100.0 / tm); |
| 513 | } |
| 514 | |
| 515 | void |
| 516 | putint(int n, int l, int c, int w) |
| 517 | { |
| 518 | char b[128]; |
| 519 | |
| 520 | move(l, c)wmove(stdscr,l,c); |
| 521 | if (n == 0) { |
| 522 | while (w-- > 0) |
| 523 | addch(' ')waddch(stdscr,' '); |
| 524 | return; |
| 525 | } |
| 526 | snprintf(b, sizeof b, "%*d", w, n); |
| 527 | if (strlen(b) > w) { |
| 528 | while (w-- > 0) |
| 529 | addch('*')waddch(stdscr,'*'); |
| 530 | return; |
| 531 | } |
| 532 | addstr(b)waddnstr(stdscr,b,-1); |
| 533 | } |
| 534 | |
| 535 | void |
| 536 | putintmk(int n, int l, int c, int w) |
| 537 | { |
| 538 | char b[128]; |
| 539 | |
| 540 | move(l, c)wmove(stdscr,l,c); |
| 541 | if (n == 0) { |
| 542 | while (w-- > 0) |
| 543 | addch(' ')waddch(stdscr,' '); |
| 544 | return; |
| 545 | } |
| 546 | if (n > 9999 * 1024) |
| 547 | snprintf(b, sizeof b, "%*dG", w - 1, n / 1024 / 1024); |
| 548 | else if (n > 9999) |
| 549 | snprintf(b, sizeof b, "%*dM", w - 1, n / 1024); |
| 550 | else |
| 551 | snprintf(b, sizeof b, "%*dK", w - 1, n); |
| 552 | if (strlen(b) > w) { |
| 553 | while (w-- > 0) |
| 554 | addch('*')waddch(stdscr,'*'); |
| 555 | return; |
| 556 | } |
| 557 | addstr(b)waddnstr(stdscr,b,-1); |
| 558 | } |
| 559 | |
| 560 | void |
| 561 | putuint64(u_int64_t n, int l, int c, int w) |
| 562 | { |
| 563 | char b[128]; |
| 564 | |
| 565 | move(l, c)wmove(stdscr,l,c); |
| 566 | if (n == 0) { |
| 567 | while (w-- > 0) |
| 568 | addch(' ')waddch(stdscr,' '); |
| 569 | return; |
| 570 | } |
| 571 | snprintf(b, sizeof b, "%*llu", w, n); |
| 572 | if (strlen(b) > w) { |
| 573 | while (w-- > 0) |
| 574 | addch('*')waddch(stdscr,'*'); |
| 575 | return; |
| 576 | } |
| 577 | addstr(b)waddnstr(stdscr,b,-1); |
| 578 | } |
| 579 | |
| 580 | void |
| 581 | putfloat(double f, int l, int c, int w, int d, int nz) |
| 582 | { |
| 583 | char b[128]; |
| 584 | |
| 585 | move(l, c)wmove(stdscr,l,c); |
| 586 | if (nz && f == 0.0) { |
| 587 | while (--w >= 0) |
| 588 | addch(' ')waddch(stdscr,' '); |
| 589 | return; |
| 590 | } |
| 591 | snprintf(b, sizeof b, "%*.*f", w, d, f); |
| 592 | if (strlen(b) > w) { |
| 593 | while (--w >= 0) |
| 594 | addch('*')waddch(stdscr,'*'); |
| 595 | return; |
| 596 | } |
| 597 | addstr(b)waddnstr(stdscr,b,-1); |
| 598 | } |
| 599 | |
| 600 | static void |
| 601 | getinfo(struct Info *si) |
| 602 | { |
| 603 | static int cpustats_mib[3] = { CTL_KERN1, KERN_CPUSTATS85, 0 }; |
| 604 | static int nchstats_mib[2] = { CTL_KERN1, KERN_NCHSTATS41 }; |
| 605 | static int uvmexp_mib[2] = { CTL_VM2, VM_UVMEXP4 }; |
| 606 | static int vmtotal_mib[2] = { CTL_VM2, VM_METER1 }; |
| 607 | struct cpustats cs; |
| 608 | int mib[4], i, j; |
| 609 | size_t size; |
| 610 | |
| 611 | dkreadstats(); |
| 612 | |
| 613 | for (i = 0; i < nintr; i++) { |
| 614 | mib[0] = CTL_KERN1; |
| 615 | mib[1] = KERN_INTRCNT63; |
| 616 | mib[2] = KERN_INTRCNT_CNT2; |
| 617 | mib[3] = i; |
| 618 | size = sizeof(si->intrcnt[i]); |
| 619 | if (sysctl(mib, 4, &si->intrcnt[i], &size, NULL((void *)0), 0) == -1) { |
| 620 | si->intrcnt[i] = 0; |
| 621 | } |
| 622 | } |
| 623 | |
| 624 | memset(&si->cpustats.cs_time, 0, sizeof(si->cpustats.cs_time)); |
| 625 | for (i = 0; i < ncpu; i++) { |
| 626 | cpustats_mib[2] = i; |
| 627 | size = sizeof(cs); |
| 628 | if (sysctl(cpustats_mib, 3, &cs, &size, NULL((void *)0), 0) == -1) { |
| 629 | error("Can't get KERN_CPUSTATS: %s\n", strerror(errno(*__errno()))); |
| 630 | memset(&si->cpustats, 0, sizeof(si->cpustats)); |
| 631 | } |
| 632 | if ((cs.cs_flags & CPUSTATS_ONLINE0x0001) == 0) |
| 633 | continue; /* omit totals for offline CPUs */ |
| 634 | for (j = 0; j < nitems(cs.cs_time)(sizeof((cs.cs_time)) / sizeof((cs.cs_time)[0])); j++) |
| 635 | si->cpustats.cs_time[j] += cs.cs_time[j]; |
| 636 | } |
| 637 | |
| 638 | size = sizeof(si->nchstats); |
| 639 | if (sysctl(nchstats_mib, 2, &si->nchstats, &size, NULL((void *)0), 0) == -1) { |
| 640 | error("Can't get KERN_NCHSTATS: %s\n", strerror(errno(*__errno()))); |
| 641 | memset(&si->nchstats, 0, sizeof(si->nchstats)); |
| 642 | } |
| 643 | |
| 644 | size = sizeof(si->uvmexp); |
| 645 | if (sysctl(uvmexp_mib, 2, &si->uvmexp, &size, NULL((void *)0), 0) == -1) { |
| 646 | error("Can't get VM_UVMEXP: %s\n", strerror(errno(*__errno()))); |
| 647 | memset(&si->uvmexp, 0, sizeof(si->uvmexp)); |
| 648 | } |
| 649 | |
| 650 | size = sizeof(si->Total); |
| 651 | if (sysctl(vmtotal_mib, 2, &si->Total, &size, NULL((void *)0), 0) == -1) { |
| 652 | error("Can't get VM_METER: %s\n", strerror(errno(*__errno()))); |
| 653 | memset(&si->Total, 0, sizeof(si->Total)); |
| 654 | } |
| 655 | } |
| 656 | |
| 657 | static void |
| 658 | allocinfo(struct Info *si) |
| 659 | { |
| 660 | memset(si, 0, sizeof(*si)); |
| 661 | si->intrcnt = calloc(nintr, sizeof(*si->intrcnt)); |
| 662 | if (si->intrcnt == NULL((void *)0)) |
| 663 | err(2, NULL((void *)0)); |
| 664 | } |
| 665 | |
| 666 | static void |
| 667 | copyinfo(struct Info *from, struct Info *to) |
| 668 | { |
| 669 | uint64_t *intrcnt; |
| 670 | |
| 671 | intrcnt = to->intrcnt; |
| 672 | *to = *from; |
| 673 | memcpy(to->intrcnt = intrcnt, from->intrcnt, nintr * sizeof(*intrcnt)); |
| 674 | } |
| 675 | |
| 676 | static void |
| 677 | dinfo(int dn, int c) |
| 678 | { |
| 679 | double words, atime, etime; |
| 680 | |
| 681 | etime = naptime; |
| 682 | |
| 683 | c += DISKCOL0; |
| 684 | |
| 685 | /* time busy in disk activity */ |
| 686 | atime = (double)cur.dk_time[dn].tv_sec + |
| 687 | ((double)cur.dk_time[dn].tv_usec / (double)1000000); |
| 688 | |
| 689 | /* # of K transferred */ |
| 690 | words = (cur.dk_rbytes[dn] + cur.dk_wbytes[dn]) / 1024.0; |
| 691 | |
| 692 | putint((int)((float)cur.dk_seek[dn]/etime+0.5), DISKROW18 + 1, c, 5); |
| 693 | putint((int)((float)(cur.dk_rxfer[dn] + cur.dk_wxfer[dn])/etime+0.5), |
| 694 | DISKROW18 + 2, c, 5); |
| 695 | putintmk((int)(words/etime + 0.5), DISKROW18 + 3, c, 5); |
| 696 | putfloat(atime/etime, DISKROW18 + 4, c, 5, 1, 1); |
| 697 | } |
| 698 | |
| 699 | |
| 700 | |
| 701 | int |
| 702 | select_vm(void) |
| 703 | { |
| 704 | num_disp = 0; |
| 705 | return (0); |
| 706 | } |
| 707 | |
| 708 | int |
| 709 | read_vm(void) |
| 710 | { |
| 711 | if (state == TIME) |
| 712 | copyinfo(&s3, &s1); |
| 713 | fetchkre(); |
| 714 | fetchifstat(); |
| 715 | if (state == TIME) |
| 716 | dkswap(); |
| 717 | num_disp = 0; |
| 718 | return 0; |
| 719 | } |
| 720 | |
| 721 | |
| 722 | void |
| 723 | print_vm(void) |
| 724 | { |
| 725 | copyinfo(&s3, &s); |
| 726 | labelkre(); |
| 727 | showkre(); |
| 728 | } |