From owner-freebsd-hackers@FreeBSD.ORG Fri Nov 21 01:24:16 2003 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3278916A4CE for ; Fri, 21 Nov 2003 01:24:16 -0800 (PST) Received: from gandalf.online.bg (gandalf.online.bg [217.75.128.9]) by mx1.FreeBSD.org (Postfix) with SMTP id 941A443FFB for ; Fri, 21 Nov 2003 01:24:12 -0800 (PST) (envelope-from roam@ringlet.net) Received: (qmail 22105 invoked from network); 21 Nov 2003 09:22:38 -0000 Received: from office.sbnd.net (HELO straylight.ringlet.net) (217.75.140.130) by gandalf.online.bg with SMTP; 21 Nov 2003 09:22:38 -0000 Received: (qmail 22389 invoked by uid 1000); 21 Nov 2003 09:24:06 -0000 Date: Fri, 21 Nov 2003 11:24:06 +0200 From: Peter Pentchev To: Dag-Erling Sm?rgrav Message-ID: <20031121092406.GR300@straylight.m.ringlet.net> Mail-Followup-To: Dag-Erling Sm?rgrav , Mike Tancsa , hackers@freebsd.org References: <20031120044945.GA44933@falcon.midgard.homeip.net> <20031120131903.GG300@straylight.m.ringlet.net> <20031120153655.GI300@straylight.m.ringlet.net> <20031121085300.GP300@straylight.m.ringlet.net> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="xtx0sNU5lZ46KfgK" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.5.1i cc: hackers@freebsd.org cc: Mike Tancsa Subject: Re: interrupt statistics X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 Nov 2003 09:24:16 -0000 --xtx0sNU5lZ46KfgK Content-Type: text/plain; charset=windows-1251 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Nov 21, 2003 at 09:56:40AM +0100, Dag-Erling Sm?rgrav wrote: > Peter Pentchev writes: > > Point taken. I was going to attach a patch that uses sysctlbyname(3), > > fixes another buglet in the !VMSTAT_SYSCTL case (and is less intrusive), > > and removes the intrcnt/intrnames-related namelist definitions for the > > VMSTAT_SYSCTL case. However, it seems to have "issues" on 64-bit > > platforms, or at least beast. I'm working on it. >=20 > Never mind, I'll take it from here. I've been working on it for the > past hour and have a ton of additional patches. There are other > issues to address such as the fact that your patch breaks post-mortem > use, and the desirability of removing vmstat's setgid bit. I was thinking about the setgid bit too, but it can only be removed when all of vmstat's functionality, not just dointr(), is converted to use sysctl. That was the next item on my todo list :) Still, here's the updated patch I was speaking of, just to show you what I meant about the !VMSTAT_SYSCTL buglet and it being less intrusive; kvm_openfiles() was not invoked even in the !VMSTAT_SYSCTL case, meaning dointr() wouldn't work at all then. G'luck, Peter --=20 Peter Pentchev roam@ringlet.net roam@sbnd.net roam@FreeBSD.org PGP key: http://people.FreeBSD.org/~roam/roam.key.asc Key fingerprint FDBA FD79 C26F 3C51 C95E DF9E ED18 B68D 1619 4553 Thit sentence is not self-referential because "thit" is not a word. Index: src/usr.bin/vmstat/Makefile =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 @@ =20 PROG=3D vmstat MAN=3D vmstat.8 +CFLAGS+=3D-DVMSTAT_SYSCTL BINGRP=3D kmem BINMODE=3D2555 DPADD=3D ${LIBKVM} ${LIBDEVSTAT} Index: src/usr.bin/vmstat/vmstat.8 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 21 Nov 2003 08:24:52 -0000 @@ -129,6 +129,7 @@ struct vmmeter sum, osum; =20 int winlines =3D 20; +int aflag =3D 0; int nflag =3D 0; =20 kvm_t *kd; @@ -174,8 +175,11 @@ memf =3D nlistf =3D NULL; interval =3D reps =3D todo =3D 0; maxshowdevs =3D 2; - while ((c =3D getopt(argc, argv, "c:fiM:mN:n:p:stw:z")) !=3D -1) { + while ((c =3D getopt(argc, argv, "ac:fiM:mN:n:p:stw:z")) !=3D -1) { switch (c) { + case 'a': + aflag++; + break; case 'c': reps =3D atoi(optarg); break; @@ -239,6 +243,9 @@ if (nlistf !=3D NULL || memf !=3D NULL) setgid(getgid()); =20 +#ifdef VMSTAT_SYSCTL + if (todo & ~INTRSTAT) { +#endif /* VMSTAT_SYSCTL */ kd =3D kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf); if (kd =3D=3D 0)=20 errx(1, "kvm_openfiles: %s", errbuf); @@ -258,6 +265,9 @@ warnx("kvm_nlist: %s", kvm_geterr(kd)); exit(1); } +#ifdef VMSTAT_SYSCTL + } +#endif /* VMSTAT_SYSCTL */ =20 if (todo & VMSTAT) { struct winsize winsize; @@ -386,8 +396,26 @@ static time_t now; time_t uptime; =20 - if (boottime.tv_sec =3D=3D 0) + if (boottime.tv_sec =3D=3D 0) { +#ifdef VMSTAT_SYSCTL + int mib[2] =3D { CTL_KERN, KERN_BOOTTIME }; + char *value; + size_t size; + + if (sysctl(mib, 2, NULL, &size, NULL, NULL) =3D=3D -1) + err(1, "sysctl(kern.boottime)"); + if (size < sizeof(boottime)) + errx(1, "sizeof(kern.boottime) < sizeof(timeval)"); + value =3D malloc(size); + if (value =3D=3D NULL) + errx(1, "malloc"); + if (sysctl(mib, 2, value, &size, NULL, NULL) =3D=3D -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 =3D now - boottime.tv_sec; if (uptime <=3D 0 || uptime > 60*60*24*365*10) @@ -732,8 +760,41 @@ int i, istrnamlen; size_t clen; char *intrname, *tintrname; +#ifdef VMSTAT_SYSCTL + int *mibcnt, *mibname; + size_t mibcntsize, mibnamesize; +#endif /* VMSTAT_SYSCTL */ =20 uptime =3D getuptime(); +#ifdef VMSTAT_SYSCTL + /* Fetch the sysctl MIB's */ + if (sysctlnametomib("hw.intrcnt", NULL, &mibcntsize) =3D=3D -1) + err(1, "fetching the MIB for the hw.intrcnt sysctl"); + mibcnt =3D malloc(mibcntsize * sizeof(int)); + if (mibcnt =3D=3D NULL) + errx(1, "malloc"); + if (sysctlnametomib("hw.intrcnt", mibcnt, &mibcntsize) =3D=3D -1) + err(1, "fetching the MIB for the hw.intrcnt sysctl"); + if (sysctlnametomib("hw.intrnames", NULL, &mibnamesize) =3D=3D -1) + err(1, "fetching the MIB for the hw.intrnames sysctl"); + mibname =3D malloc(mibnamesize * sizeof(int)); + if (mibname =3D=3D NULL) + errx(1, "malloc"); + if (sysctlnametomib("hw.intrnames", mibname, &mibnamesize) =3D=3D -1) + err(1, "fetching the MIB for the hw.intrnames sysctl"); + + /* Fetch the arrays themselves */ + if (sysctl(mibcnt, mibcntsize, NULL, &nintr, NULL, NULL) =3D=3D -1) + err(1, "sysctl(hw.intrcnt)"); + intrcnt =3D malloc((size_t)nintr); + if (sysctl(mibcnt, mibcntsize, intrcnt, &nintr, NULL, NULL) =3D=3D -1) + err(1, "sysctl(hw.intrcnt)"); + if (sysctl(mibname, mibnamesize, NULL, &inamlen, NULL, NULL) =3D=3D -1) + err(1, "sysctl(hw.intrnames)"); + intrname =3D malloc((size_t)inamlen); + if (sysctl(mibname, mibnamesize, intrname, &inamlen, NULL, NULL) =3D=3D -= 1) + err(1, "sysctl(hw.intrnames)"); +#else /* VMSTAT_SYSCTL */ nintr =3D namelist[X_EINTRCNT].n_value - namelist[X_INTRCNT].n_value; inamlen =3D namelist[X_EINTRNAMES].n_value - namelist[X_INTRNAMES].n_value; @@ -743,6 +804,7 @@ errx(1, "malloc"); kread(X_INTRCNT, intrcnt, (size_t)nintr); kread(X_INTRNAMES, intrname, (size_t)inamlen); +#endif /* VMSTAT_SYSCTL */ nintr /=3D sizeof(u_long); tintrname =3D intrname; istrnamlen =3D strlen("interrupt"); @@ -756,7 +818,7 @@ "rate"); inttotal =3D 0; while (--nintr >=3D 0) { - if (*intrcnt) + if (*intrcnt || (aflag && intrname[0])) (void)printf("%-*s %20lu %10lu\n", istrnamlen, intrname, *intrcnt, *intrcnt / uptime); intrname +=3D strlen(intrname) + 1; @@ -829,7 +891,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); } --xtx0sNU5lZ46KfgK Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (FreeBSD) iD8DBQE/vdm27Ri2jRYZRVMRAr+MAJ9cTo49Ql6Rq+GsH5EKrYRgqOQ+oACfbLCY H+LdM96ec4qJiKNC8s98lLY= =2Rhd -----END PGP SIGNATURE----- --xtx0sNU5lZ46KfgK--