On Thu, Nov 20, 2003 at 05:36:55PM +0200, Peter Pentchev wrote: > On Thu, Nov 20, 2003 at 02:59:55PM +0100, Dag-Erling Sm?rgrav wrote: > > Peter Pentchev <[EMAIL PROTECTED]> writes: > > > This is easily fixed, e.g. by the attached. Note that I've only tested > > > the RELENG_4 patch, my 5.x machine is out of commission for the next few > > > days :( (and no, I couldn't test it on ref5 for obvious reasons related > > > to /dev/mem ;) > > > > Hmm, vmstat should uses sysctls, not /dev/mem. Perhaps you can make a > > patch for that too? :) > > Awwighty, attached is a patch that converts getuptime() and dointr() to > use sysctl, and then adds the -a option to display all interrupts. > This one was tested on both RELENG_4 and HEAD (ref5) :)
Oops; a little buglet (deleted one character too many) in the HEAD patch for the !VMSTAT_SYSCTL case. New HEAD patch attached. G'luck, Peter -- Peter Pentchev [EMAIL PROTECTED] [EMAIL PROTECTED] [EMAIL PROTECTED] PGP key: http://people.FreeBSD.org/~roam/roam.key.asc Key fingerprint FDBA FD79 C26F 3C51 C95E DF9E ED18 B68D 1619 4553 because I didn't think of a good beginning of it.
Index: src/usr.bin/vmstat/Makefile =================================================================== RCS file: /home/ncvs/src/usr.bin/vmstat/Makefile,v retrieving revision 1.9 diff -u -r1.9 Makefile --- src/usr.bin/vmstat/Makefile 8 Feb 2002 23:07:36 -0000 1.9 +++ src/usr.bin/vmstat/Makefile 20 Nov 2003 15:51:53 -0000 @@ -3,6 +3,7 @@ PROG= vmstat MAN= vmstat.8 +CFLAGS+=-DVMSTAT_SYSCTL BINGRP= kmem BINMODE=2555 DPADD= ${LIBKVM} ${LIBDEVSTAT} Index: src/usr.bin/vmstat/vmstat.8 =================================================================== RCS file: /home/ncvs/src/usr.bin/vmstat/vmstat.8,v retrieving revision 1.25 diff -u -r1.25 vmstat.8 --- src/usr.bin/vmstat/vmstat.8 14 Apr 2003 07:22:25 -0000 1.25 +++ src/usr.bin/vmstat/vmstat.8 20 Nov 2003 15:51:53 -0000 @@ -41,7 +41,7 @@ .Sh SYNOPSIS .Nm .\" .Op Fl fimst -.Op Fl fimsz +.Op Fl afimsz .Op Fl c Ar count .Op Fl M Ar core .Op Fl N Ar system @@ -62,6 +62,10 @@ .Pp The options are as follows: .Bl -tag -width indent +.It Fl a +When used with +.Fl i , +include statistics about interrupts that have never been generated. .It Fl c Repeat the display .Ar count Index: src/usr.bin/vmstat/vmstat.c =================================================================== RCS file: /home/ncvs/src/usr.bin/vmstat/vmstat.c,v retrieving revision 1.69 diff -u -r1.69 vmstat.c --- src/usr.bin/vmstat/vmstat.c 9 Nov 2003 20:39:56 -0000 1.69 +++ src/usr.bin/vmstat/vmstat.c 20 Nov 2003 15:53:00 -0000 @@ -129,6 +129,7 @@ struct vmmeter sum, osum; int winlines = 20; +int aflag = 0; int nflag = 0; kvm_t *kd; @@ -174,8 +175,11 @@ memf = nlistf = NULL; interval = reps = todo = 0; maxshowdevs = 2; - while ((c = getopt(argc, argv, "c:fiM:mN:n:p:stw:z")) != -1) { + while ((c = getopt(argc, argv, "ac:fiM:mN:n:p:stw:z")) != -1) { switch (c) { + case 'a': + aflag++; + break; case 'c': reps = atoi(optarg); break; @@ -239,24 +243,26 @@ if (nlistf != NULL || memf != NULL) setgid(getgid()); - kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf); - if (kd == 0) - errx(1, "kvm_openfiles: %s", errbuf); - setgid(getgid()); - - if ((c = kvm_nlist(kd, namelist)) != 0) { - if (c > 0) { - warnx("undefined symbols:"); - for (c = 0; - c < (int)(sizeof(namelist)/sizeof(namelist[0])); - c++) - if (namelist[c].n_type == 0) - (void)fprintf(stderr, " %s", - namelist[c].n_name); - (void)fputc('\n', stderr); - } else - warnx("kvm_nlist: %s", kvm_geterr(kd)); - exit(1); + if (todo & ~INTRSTAT) { + kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf); + if (kd == 0) + errx(1, "kvm_openfiles: %s", errbuf); + setgid(getgid()); + + if ((c = kvm_nlist(kd, namelist)) != 0) { + if (c > 0) { + warnx("undefined symbols:"); + for (c = 0; + c < (int)(sizeof(namelist)/sizeof(namelist[0])); + c++) + if (namelist[c].n_type == 0) + (void)fprintf(stderr, " %s", + namelist[c].n_name); + (void)fputc('\n', stderr); + } else + warnx("kvm_nlist: %s", kvm_geterr(kd)); + exit(1); + } } if (todo & VMSTAT) { @@ -386,8 +392,26 @@ static time_t now; time_t uptime; - if (boottime.tv_sec == 0) + if (boottime.tv_sec == 0) { +#ifdef VMSTAT_SYSCTL + int mib[2] = { CTL_KERN, KERN_BOOTTIME }; + char *value; + size_t size; + + if (sysctl(mib, 2, NULL, &size, NULL, NULL) == -1) + err(1, "sysctl(kern.boottime)"); + if (size < sizeof(boottime)) + errx(1, "sizeof(kern.boottime) < sizeof(timeval)"); + value = malloc(size); + if (value == NULL) + errx(1, "malloc"); + if (sysctl(mib, 2, value, &size, NULL, NULL) == -1) + err(1, "sysctl(kern.boottime)"); + memcpy(&boottime, value, sizeof(boottime)); +#else /* VMSTAT_SYSCTL */ kread(X_BOOTTIME, &boottime, sizeof(boottime)); +#endif /* VMSTAT_SYSCTL */ + } (void)time(&now); uptime = now - boottime.tv_sec; if (uptime <= 0 || uptime > 60*60*24*365*10) @@ -732,8 +756,41 @@ int i, istrnamlen; size_t clen; char *intrname, *tintrname; +#ifdef VMSTAT_SYSCTL + int *mibcnt, *mibname; + size_t mibcntsize, mibnamesize; +#endif /* VMSTAT_SYSCTL */ uptime = getuptime(); +#ifdef VMSTAT_SYSCTL + /* Fetch the sysctl MIB's */ + if (sysctlnametomib("hw.intrcnt", NULL, &mibcntsize) == -1) + err(1, "fetching the MIB for the hw.intrcnt sysctl"); + mibcnt = malloc(mibcntsize * sizeof(int)); + if (mibcnt == NULL) + errx(1, "malloc"); + if (sysctlnametomib("hw.intrcnt", mibcnt, &mibcntsize) == -1) + err(1, "fetching the MIB for the hw.intrcnt sysctl"); + if (sysctlnametomib("hw.intrnames", NULL, &mibnamesize) == -1) + err(1, "fetching the MIB for the hw.intrnames sysctl"); + mibname = malloc(mibnamesize * sizeof(int)); + if (mibname == NULL) + errx(1, "malloc"); + if (sysctlnametomib("hw.intrnames", mibname, &mibnamesize) == -1) + err(1, "fetching the MIB for the hw.intrnames sysctl"); + + /* Fetch the arrays themselves */ + if (sysctl(mibcnt, mibcntsize, NULL, &nintr, NULL, NULL) == -1) + err(1, "sysctl(hw.intrcnt)"); + intrcnt = malloc((size_t)nintr); + if (sysctl(mibcnt, mibcntsize, intrcnt, &nintr, NULL, NULL) == -1) + err(1, "sysctl(hw.intrcnt)"); + if (sysctl(mibname, mibnamesize, NULL, &inamlen, NULL, NULL) == -1) + err(1, "sysctl(hw.intrnames)"); + intrname = malloc((size_t)inamlen); + if (sysctl(mibname, mibnamesize, intrname, &inamlen, NULL, NULL) == -1) + err(1, "sysctl(hw.intrnames)"); +#else /* VMSTAT_SYSCTL */ nintr = namelist[X_EINTRCNT].n_value - namelist[X_INTRCNT].n_value; inamlen = namelist[X_EINTRNAMES].n_value - namelist[X_INTRNAMES].n_value; @@ -743,6 +800,7 @@ errx(1, "malloc"); kread(X_INTRCNT, intrcnt, (size_t)nintr); kread(X_INTRNAMES, intrname, (size_t)inamlen); +#endif /* VMSTAT_SYSCTL */ nintr /= sizeof(u_long); tintrname = intrname; istrnamlen = strlen("interrupt"); @@ -756,7 +814,7 @@ "rate"); inttotal = 0; while (--nintr >= 0) { - if (*intrcnt) + if (*intrcnt || (aflag && intrname[0])) (void)printf("%-*s %20lu %10lu\n", istrnamlen, intrname, *intrcnt, *intrcnt / uptime); intrname += strlen(intrname) + 1; @@ -829,7 +887,7 @@ usage() { (void)fprintf(stderr, "%s%s", - "usage: vmstat [-imsz] [-c count] [-M core] [-N system] [-w wait]\n", + "usage: vmstat [-aimsz] [-c count] [-M core] [-N system] [-w wait]\n", " [-n devs] [disks]\n"); exit(1); }
pgp00000.pgp
Description: PGP signature