=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/vmstat/vmstat.c,v retrieving revision 1.49 retrieving revision 1.50 diff -c -r1.49 -r1.50 *** src/usr.bin/vmstat/vmstat.c 2001/04/30 09:39:27 1.49 --- src/usr.bin/vmstat/vmstat.c 2001/04/30 12:07:30 1.50 *************** *** 1,5 **** /* $NetBSD: vmstat.c,v 1.29.4.1 1996/06/05 00:21:05 cgd Exp $ */ ! /* $OpenBSD: vmstat.c,v 1.49 2001/04/30 09:39:27 art Exp $ */ /* * Copyright (c) 1980, 1986, 1991, 1993 --- 1,5 ---- /* $NetBSD: vmstat.c,v 1.29.4.1 1996/06/05 00:21:05 cgd Exp $ */ ! /* $OpenBSD: vmstat.c,v 1.50 2001/04/30 12:07:30 art Exp $ */ /* * Copyright (c) 1980, 1986, 1991, 1993 *************** *** 119,125 **** { "_forkstat" }, #define X_POOLHEAD 14 { "_pool_head" }, ! #define X_END 15 #if defined(__pc532__) #define X_IVT (X_END) { "_ivt" }, --- 119,127 ---- { "_forkstat" }, #define X_POOLHEAD 14 { "_pool_head" }, ! #define X_NSELCOLL 16 ! { "_nselcoll" }, ! #define X_END 16 #if defined(__pc532__) #define X_IVT (X_END) { "_ivt" }, *************** *** 174,179 **** --- 176,183 ---- /* Namelist and memory file names. */ char *nlistf, *memf; + extern char *__progname; + int main(argc, argv) register int argc; *************** *** 238,248 **** } kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf); ! if (kd == 0) { ! (void)fprintf(stderr, ! "vmstat: kvm_openfiles: %s\n", errbuf); ! exit(1); ! } if ((c = kvm_nlist(kd, namelist)) != 0) { --- 242,249 ---- } kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf); ! if (kd == 0) ! errx(1, "kvm_openfiles: %s", errbuf); if ((c = kvm_nlist(kd, namelist)) != 0) { *************** *** 251,267 **** if (c > 0) { (void)fprintf(stderr, ! "vmstat: undefined symbols:"); for (c = 0; c < sizeof(namelist)/sizeof(namelist[0]); c++) if (namelist[c].n_type == 0) fprintf(stderr, " %s", namelist[c].n_name); (void)fputc('\n', stderr); } else ! (void)fprintf(stderr, "vmstat: kvm_nlist: %s\n", ! kvm_geterr(kd)); ! exit(1); } if (todo & VMSTAT) { --- 252,267 ---- if (c > 0) { (void)fprintf(stderr, ! "%s: undefined symbols:", __progname); for (c = 0; c < sizeof(namelist)/sizeof(namelist[0]); c++) if (namelist[c].n_type == 0) fprintf(stderr, " %s", namelist[c].n_name); (void)fputc('\n', stderr); + exit(1); } else ! errx(1, "kvm_nlist: %s", kvm_geterr(kd)); } if (todo & VMSTAT) { *************** *** 352,367 **** static time_t now; static struct timeval boottime; time_t uptime; ! if (boottime.tv_sec == 0) ! kread(X_BOOTTIME, &boottime, sizeof(boottime)); (void)time(&now); uptime = now - boottime.tv_sec; ! if (uptime <= 0 || uptime > 60*60*24*365*10) { ! (void)fprintf(stderr, ! "vmstat: time makes no sense; namelist must be wrong.\n"); ! exit(1); ! } return(uptime); } --- 352,379 ---- static time_t now; static struct timeval boottime; time_t uptime; + int mib[2]; + size_t size; ! if (boottime.tv_sec == 0) { ! if (nlist == NULL && memf == NULL) { ! kread(X_BOOTTIME, &boottime, sizeof(boottime)); ! } else { ! size = sizeof(boottime); ! mib[0] = CTL_KERN; ! mib[1] = KERN_BOOTTIME; ! if (sysctl(mib, 2, &boottime, &size, NULL, 0) < 0) { ! printf("Can't get kerninfo: %s\n", ! strerror(errno)); ! bzero(&boottime, sizeof(boottime)); ! } ! } ! } (void)time(&now); uptime = now - boottime.tv_sec; ! if (uptime <= 0 || uptime > 60*60*24*365*10) ! errx(1, "time makes no sense; namelist must be wrong"); ! return(uptime); } *************** *** 376,391 **** time_t uptime, halfuptime; void needhdr(); int mib[2]; size_t size; uptime = getuptime(); halfuptime = uptime / 2; (void)signal(SIGCONT, needhdr); ! if (namelist[X_STATHZ].n_type != 0 && namelist[X_STATHZ].n_value != 0) ! kread(X_STATHZ, &hz, sizeof(hz)); ! if (!hz) ! kread(X_HZ, &hz, sizeof(hz)); for (hdrcnt = 1;;) { if (!--hdrcnt) --- 388,408 ---- time_t uptime, halfuptime; void needhdr(); int mib[2]; + struct clockinfo clkinfo; size_t size; uptime = getuptime(); halfuptime = uptime / 2; (void)signal(SIGCONT, needhdr); ! mib[0] = CTL_KERN; ! mib[1] = KERN_CLOCKRATE; ! size = sizeof(clkinfo); ! if (sysctl(mib, 2, &clkinfo, &size, NULL, 0) < 0) { ! printf("Can't get kerninfo: %s\n", strerror(errno)); ! return; ! } ! hz = clkinfo.stathz; for (hdrcnt = 1;;) { if (!--hdrcnt) *************** *** 542,547 **** --- 559,565 ---- { struct nchstats nchstats; long nchtotal; + int nselcoll; #ifdef UVM kread(X_UVMEXP, &uvmexp, sizeof(uvmexp)); *************** *** 637,642 **** --- 655,662 ---- PCT(nchstats.ncs_badhits, nchtotal), PCT(nchstats.ncs_falsehits, nchtotal), PCT(nchstats.ncs_long, nchtotal)); + kread(X_NSELCOLL, &nselcoll, sizeof(nselcoll)); + (void)printf("%11d select collisions\n", nselcoll); } void *************** *** 719,727 **** for (j = 0; j < 16; j++, ivp++) { if (ivp->iv_vec && ivp->iv_use && ivp->iv_cnt) { if (kvm_read(kd, (u_long)ivp->iv_use, iname, 63) != 63) { ! (void)fprintf(stderr, "vmstat: iv_use: %s\n", ! kvm_geterr(kd)); ! exit(1); } (void)printf("%-12s %10ld %8ld\n", iname, ivp->iv_cnt, ivp->iv_cnt / uptime); --- 739,745 ---- for (j = 0; j < 16; j++, ivp++) { if (ivp->iv_vec && ivp->iv_use && ivp->iv_cnt) { if (kvm_read(kd, (u_long)ivp->iv_use, iname, 63) != 63) { ! errx(1, "iv_use: %s", kvm_geterr(kd)); } (void)printf("%-12s %10ld %8ld\n", iname, ivp->iv_cnt, ivp->iv_cnt / uptime); *************** *** 741,749 **** dointr() { struct intrhand *intrhand[16], *ihp, ih; ! long inttotal; time_t uptime; ! int intrstray[16]; char iname[17], fname[31]; int i; --- 759,767 ---- dointr() { struct intrhand *intrhand[16], *ihp, ih; ! u_long inttotal; time_t uptime; ! u_long intrstray[16]; char iname[17], fname[31]; int i; *************** *** 762,768 **** if (kvm_read(kd, (u_long)ih.ih_what, iname, 16) != 16) errx(1, "vmstat: ih_what: %s", kvm_geterr(kd)); snprintf(fname, sizeof fname, "irq%d/%s", i, iname); ! printf("%-16.16s %10ld %8ld\n", fname, ih.ih_count, ih.ih_count / uptime); inttotal += ih.ih_count; ihp = ih.ih_next; --- 780,786 ---- if (kvm_read(kd, (u_long)ih.ih_what, iname, 16) != 16) errx(1, "vmstat: ih_what: %s", kvm_geterr(kd)); snprintf(fname, sizeof fname, "irq%d/%s", i, iname); ! printf("%-16.16s %10lu %8lu\n", fname, ih.ih_count, ih.ih_count / uptime); inttotal += ih.ih_count; ihp = ih.ih_next; *************** *** 770,780 **** } for (i = 0; i < 16; i++) if (intrstray[i]) { ! printf("Stray irq %-2d %10d %8d\n", i, intrstray[i], intrstray[i] / uptime); inttotal += intrstray[i]; } ! printf("Total %10ld %8ld\n", inttotal, inttotal / uptime); } #else void --- 788,798 ---- } for (i = 0; i < 16; i++) if (intrstray[i]) { ! printf("Stray irq %-2d %10lu %8lu\n", i, intrstray[i], intrstray[i] / uptime); inttotal += intrstray[i]; } ! printf("Total %10lu %8lu\n", inttotal, inttotal / uptime); } #else void *************** *** 794,803 **** namelist[X_EINTRNAMES].n_value - namelist[X_INTRNAMES].n_value; intrcnt = malloc((size_t)nintr); intrname = malloc((size_t)inamlen); ! if (intrcnt == NULL || intrname == NULL) { ! (void)fprintf(stderr, "vmstat: %s.\n", strerror(errno)); ! exit(1); ! } kread(X_INTRCNT, intrcnt, (size_t)nintr); kread(X_INTRNAMES, intrname, (size_t)inamlen); (void)printf("interrupt total rate\n"); --- 812,819 ---- namelist[X_EINTRNAMES].n_value - namelist[X_INTRNAMES].n_value; intrcnt = malloc((size_t)nintr); intrname = malloc((size_t)inamlen); ! if (intrcnt == NULL || intrname == NULL) ! err(1, "malloc"); kread(X_INTRCNT, intrcnt, (size_t)nintr); kread(X_INTRNAMES, intrname, (size_t)inamlen); (void)printf("interrupt total rate\n"); *************** *** 814,831 **** evptr = allevents.tqh_first; while (evptr) { if (kvm_read(kd, (long)evptr, (void *)&evcnt, ! sizeof evcnt) != sizeof evcnt) { ! (void)fprintf(stderr, "vmstat: event chain trashed: %s\n", ! kvm_geterr(kd)); ! exit(1); ! } if (strcmp(evcnt.ev_name, "intr") == 0) { if (kvm_read(kd, (long)evcnt.ev_dev, (void *)&dev, ! sizeof dev) != sizeof dev) { ! (void)fprintf(stderr, "vmstat: event chain trashed: %s\n", ! kvm_geterr(kd)); ! exit(1); ! } if (evcnt.ev_count) (void)printf("%-14s %12d %8ld\n", dev.dv_xname, evcnt.ev_count, (long)(evcnt.ev_count / uptime)); --- 830,841 ---- evptr = allevents.tqh_first; while (evptr) { if (kvm_read(kd, (long)evptr, (void *)&evcnt, ! sizeof evcnt) != sizeof evcnt) ! errx(1, "event chain trashed: %s", kvm_geterr(kd)); if (strcmp(evcnt.ev_name, "intr") == 0) { if (kvm_read(kd, (long)evcnt.ev_dev, (void *)&dev, ! sizeof dev) != sizeof dev) ! errx(1, "event chain trashed: %s", kvm_geterr(kd)); if (evcnt.ev_count) (void)printf("%-14s %12d %8ld\n", dev.dv_xname, evcnt.ev_count, (long)(evcnt.ev_count / uptime)); *************** *** 849,860 **** register struct kmemstats *ks; register int i, j; int len, size, first; ! long totuse = 0, totfree = 0, totreq = 0; char *name; struct kmemstats kmemstats[M_LAST]; struct kmembuckets buckets[MINBUCKET + 16]; ! kread(X_KMEMBUCKETS, buckets, sizeof(buckets)); for (first = 1, i = MINBUCKET, kp = &buckets[i]; i < MINBUCKET + 16; i++, kp++) { if (kp->kb_calls == 0) --- 859,901 ---- register struct kmemstats *ks; register int i, j; int len, size, first; ! u_long totuse = 0, totfree = 0; ! quad_t totreq = 0; char *name; struct kmemstats kmemstats[M_LAST]; struct kmembuckets buckets[MINBUCKET + 16]; + int mib[4]; + size_t siz; + char buf[BUFSIZ], *bufp, *ap; ! if (memf == NULL && nlistf == NULL) { ! mib[0] = CTL_KERN; ! mib[1] = KERN_MALLOCSTATS; ! mib[2] = KERN_MALLOC_BUCKETS; ! siz = sizeof(buf); ! if (sysctl(mib, 3, buf, &siz, NULL, 0) < 0) { ! printf("Could not acquire information on kernel memory bucket sizes.\n"); ! return; ! } ! ! bufp = buf; ! mib[2] = KERN_MALLOC_BUCKET; ! siz = sizeof(struct kmembuckets); ! i = 0; ! while ((ap = strsep(&bufp, ",")) != NULL) { ! mib[3] = atoi(ap); ! ! if (sysctl(mib, 4, &buckets[MINBUCKET + i], &siz, ! NULL, 0) < 0) { ! printf("Failed to read statistics for bucket %d.\n", mib[3]); ! return; ! } ! i++; ! } ! } else { ! kread(X_KMEMBUCKETS, buckets, sizeof(buckets)); ! } ! for (first = 1, i = MINBUCKET, kp = &buckets[i]; i < MINBUCKET + 16; i++, kp++) { if (kp->kb_calls == 0) *************** *** 862,872 **** if (first) { (void)printf("Memory statistics by bucket size\n"); (void)printf( ! " Size In Use Free Requests HighWater Couldfree\n"); first = 0; } size = 1 << i; ! (void)printf("%8d %8ld %6ld %10ld %7ld %10ld\n", size, kp->kb_total - kp->kb_totalfree, kp->kb_totalfree, kp->kb_calls, kp->kb_highwat, kp->kb_couldfree); --- 903,913 ---- if (first) { (void)printf("Memory statistics by bucket size\n"); (void)printf( ! " Size In Use Free Requests HighWater Couldfree\n"); first = 0; } size = 1 << i; ! (void)printf("%8d %8qu %6qu %18qu %7qu %10qu\n", size, kp->kb_total - kp->kb_totalfree, kp->kb_totalfree, kp->kb_calls, kp->kb_highwat, kp->kb_couldfree); *************** *** 942,948 **** totreq += ks->ks_calls; } (void)printf("\nMemory Totals: In Use Free Requests\n"); ! (void)printf(" %7ldK %6ldK %8ld\n", (totuse + 1023) / 1024, (totfree + 1023) / 1024, totreq); } --- 983,989 ---- totreq += ks->ks_calls; } (void)printf("\nMemory Totals: In Use Free Requests\n"); ! (void)printf(" %7luK %6luK %8qu\n", (totuse + 1023) / 1024, (totfree + 1023) / 1024, totreq); } *************** *** 1051,1075 **** sym = namelist[nlx].n_name; if (*sym == '_') ++sym; ! (void)fprintf(stderr, ! "vmstat: symbol %s not defined\n", sym); ! exit(1); } if (kvm_read(kd, namelist[nlx].n_value, addr, size) != size) { sym = namelist[nlx].n_name; if (*sym == '_') ++sym; ! (void)fprintf(stderr, "vmstat: %s: %s\n", sym, kvm_geterr(kd)); ! exit(1); } } void usage() { ! (void)fprintf(stderr, ! "usage: vmstat [-fimst] [-c count] [-M core] \ ! [-N system] [-w wait] [disks]\n"); exit(1); } --- 1092,1112 ---- sym = namelist[nlx].n_name; if (*sym == '_') ++sym; ! errx(1, "symbol %s not defined", sym); } if (kvm_read(kd, namelist[nlx].n_value, addr, size) != size) { sym = namelist[nlx].n_name; if (*sym == '_') ++sym; ! errx(1, "%s: %s", sym, kvm_geterr(kd)); } } void usage() { ! (void)fprintf(stderr, "usage: %s [-fimst] [-c count] [-M core] " ! "[-N system] [-w wait] [disks]\n", __progname); exit(1); }