summaryrefslogtreecommitdiffstats
path: root/usr.bin/systat/vmstat.c
diff options
context:
space:
mode:
authortmm <tmm@FreeBSD.org>2001-03-23 03:58:25 +0000
committertmm <tmm@FreeBSD.org>2001-03-23 03:58:25 +0000
commitd6fecac748fdca2de8bbfd045bceab19277abab1 (patch)
tree62457bf2e3ef9a2f6fe6f055b531080c23af45c2 /usr.bin/systat/vmstat.c
parent76ba4861cd1cb43f58cdf0c32eafb5669114b1f0 (diff)
downloadFreeBSD-src-d6fecac748fdca2de8bbfd045bceab19277abab1.zip
FreeBSD-src-d6fecac748fdca2de8bbfd045bceab19277abab1.tar.gz
Get rid of setgid kmem for systat, and while being there, fix some bugs
and compiler warnings. The data for network statistics are still obtained via the kvm interface if systat was started with the needed privileges, otherwise sysctls are used. The reason for this is that with really many open sockets, the sysctl method is probably slower, but it systat -netstat is probably not really usable in either mode under these conditions. Approved by: rwatson
Diffstat (limited to 'usr.bin/systat/vmstat.c')
-rw-r--r--usr.bin/systat/vmstat.c234
1 files changed, 118 insertions, 116 deletions
diff --git a/usr.bin/systat/vmstat.c b/usr.bin/systat/vmstat.c
index f9bdc17..7779de3 100644
--- a/usr.bin/systat/vmstat.c
+++ b/usr.bin/systat/vmstat.c
@@ -74,7 +74,43 @@ static const char rcsid[] =
static struct Info {
long time[CPUSTATES];
- struct vmmeter Cnt;
+ u_int v_swtch; /* context switches */
+ u_int v_trap; /* calls to trap */
+ u_int v_syscall; /* calls to syscall() */
+ u_int v_intr; /* device interrupts */
+ u_int v_soft; /* software interrupts */
+ /*
+ * Virtual memory activity.
+ */
+ u_int v_vm_faults; /* number of address memory faults */
+ u_int v_cow_faults; /* number of copy-on-writes */
+ u_int v_zfod; /* pages zero filled on demand */
+ u_int v_ozfod; /* optimized zero fill pages */
+ u_int v_swapin; /* swap pager pageins */
+ u_int v_swapout; /* swap pager pageouts */
+ u_int v_swappgsin; /* swap pager pages paged in */
+ u_int v_swappgsout; /* swap pager pages paged out */
+ u_int v_vnodein; /* vnode pager pageins */
+ u_int v_vnodeout; /* vnode pager pageouts */
+ u_int v_vnodepgsin; /* vnode_pager pages paged in */
+ u_int v_vnodepgsout; /* vnode pager pages paged out */
+ u_int v_intrans; /* intransit blocking page faults */
+ u_int v_reactivated; /* number of pages reactivated from free list */
+ u_int v_pdwakeups; /* number of times daemon has awaken from sleep */
+ u_int v_pdpages; /* number of pages analyzed by daemon */
+
+ u_int v_dfree; /* pages freed by daemon */
+ u_int v_pfree; /* pages freed by exiting processes */
+ u_int v_tfree; /* total pages freed */
+ /*
+ * Distribution of page usages.
+ */
+ u_int v_page_size; /* page size in bytes */
+ u_int v_free_count; /* number of pages free */
+ u_int v_wire_count; /* number of pages wired down */
+ u_int v_active_count; /* number of pages active */
+ u_int v_inactive_count; /* number of pages inactive */
+ u_int v_cache_count; /* number of pages on buffer cache queue */
struct vmtotal Total;
struct nchstats nchstats;
long nchcount;
@@ -88,8 +124,6 @@ static struct Info {
struct statinfo cur, last, run;
-#define cnt s.Cnt
-#define oldcnt s1.Cnt
#define total s.Total
#define nchtotal s.nchstats
#define oldnchtotal s1.nchstats
@@ -142,21 +176,6 @@ closekre(w)
wrefresh(w);
}
-
-static struct nlist namelist[] = {
-#define X_CNT 0
- { "_cnt" },
-#define X_INTRNAMES 1
- { "_intrnames" },
-#define X_EINTRNAMES 2
- { "_eintrnames" },
-#define X_INTRCNT 3
- { "_intrcnt" },
-#define X_EINTRCNT 4
- { "_eintrcnt" },
- { "" },
-};
-
/*
* These constants define where the major pieces are laid out
*/
@@ -191,18 +210,7 @@ initkre()
char *intrnamebuf, *cp;
int i;
- if (namelist[0].n_type == 0) {
- if (kvm_nlist(kd, namelist)) {
- nlisterr(namelist);
- return(0);
- }
- if (namelist[0].n_type == 0) {
- error("No namelist");
- return(0);
- }
- }
-
- if (num_devices = getnumdevs() < 0) {
+ if ((num_devices = getnumdevs()) < 0) {
warnx("%s", devstat_errbuf);
return(0);
}
@@ -218,14 +226,13 @@ initkre()
return(0);
if (nintr == 0) {
- nintr = (namelist[X_EINTRCNT].n_value -
- namelist[X_INTRCNT].n_value) / sizeof (long);
+ GETSYSCTL("hw.nintr", nintr);
intrloc = calloc(nintr, sizeof (long));
intrname = calloc(nintr, sizeof (long));
- intrnamebuf = malloc(namelist[X_EINTRNAMES].n_value -
- namelist[X_INTRNAMES].n_value);
- if (intrnamebuf == 0 || intrname == 0 || intrloc == 0) {
- error("Out of memory\n");
+ intrnamebuf = sysctl_dynread("hw.intrnames", NULL);
+ if (intrnamebuf == NULL || intrname == NULL ||
+ intrloc == NULL) {
+ error("Out of memory");
if (intrnamebuf)
free(intrnamebuf);
if (intrname)
@@ -235,8 +242,6 @@ initkre()
nintr = 0;
return(0);
}
- NREAD(X_INTRNAMES, intrnamebuf, NVAL(X_EINTRNAMES) -
- NVAL(X_INTRNAMES));
for (cp = intrnamebuf, i = 0; i < nintr; i++) {
intrname[i] = cp;
cp += strlen(cp) + 1;
@@ -453,7 +458,7 @@ showkre()
putfloat(avenrun[1], STATROW, STATCOL + 23, 6, 2, 0);
putfloat(avenrun[2], STATROW, STATCOL + 29, 6, 2, 0);
mvaddstr(STATROW, STATCOL + 53, buf);
-#define pgtokb(pg) ((pg) * cnt.v_page_size / 1024)
+#define pgtokb(pg) ((pg) * s.v_page_size / 1024)
putint(pgtokb(total.t_arm), MEMROW + 2, MEMCOL + 3, 8);
putint(pgtokb(total.t_armshr), MEMROW + 2, MEMCOL + 11, 8);
putint(pgtokb(total.t_avm), MEMROW + 2, MEMCOL + 19, 9);
@@ -469,34 +474,34 @@ showkre()
putint(total.t_sl, PROCSROW + 1, PROCSCOL + 12, 3);
putint(total.t_sw, PROCSROW + 1, PROCSCOL + 15, 3);
if (extended_vm_stats == 0) {
- PUTRATE(Cnt.v_zfod, VMSTATROW + 0, VMSTATCOL + 4, 5);
+ PUTRATE(v_zfod, VMSTATROW + 0, VMSTATCOL + 4, 5);
}
- PUTRATE(Cnt.v_cow_faults, VMSTATROW + 1, VMSTATCOL + 3, 6);
- putint(pgtokb(cnt.v_wire_count), VMSTATROW + 2, VMSTATCOL, 9);
- putint(pgtokb(cnt.v_active_count), VMSTATROW + 3, VMSTATCOL, 9);
- putint(pgtokb(cnt.v_inactive_count), VMSTATROW + 4, VMSTATCOL, 9);
- putint(pgtokb(cnt.v_cache_count), VMSTATROW + 5, VMSTATCOL, 9);
- putint(pgtokb(cnt.v_free_count), VMSTATROW + 6, VMSTATCOL, 9);
- PUTRATE(Cnt.v_dfree, VMSTATROW + 7, VMSTATCOL, 9);
- PUTRATE(Cnt.v_pfree, VMSTATROW + 8, VMSTATCOL, 9);
- PUTRATE(Cnt.v_reactivated, VMSTATROW + 9, VMSTATCOL, 9);
- PUTRATE(Cnt.v_pdwakeups, VMSTATROW + 10, VMSTATCOL, 9);
- PUTRATE(Cnt.v_pdpages, VMSTATROW + 11, VMSTATCOL, 9);
- PUTRATE(Cnt.v_intrans, VMSTATROW + 12, VMSTATCOL, 9);
+ PUTRATE(v_cow_faults, VMSTATROW + 1, VMSTATCOL + 3, 6);
+ putint(pgtokb(s.v_wire_count), VMSTATROW + 2, VMSTATCOL, 9);
+ putint(pgtokb(s.v_active_count), VMSTATROW + 3, VMSTATCOL, 9);
+ putint(pgtokb(s.v_inactive_count), VMSTATROW + 4, VMSTATCOL, 9);
+ putint(pgtokb(s.v_cache_count), VMSTATROW + 5, VMSTATCOL, 9);
+ putint(pgtokb(s.v_free_count), VMSTATROW + 6, VMSTATCOL, 9);
+ PUTRATE(v_dfree, VMSTATROW + 7, VMSTATCOL, 9);
+ PUTRATE(v_pfree, VMSTATROW + 8, VMSTATCOL, 9);
+ PUTRATE(v_reactivated, VMSTATROW + 9, VMSTATCOL, 9);
+ PUTRATE(v_pdwakeups, VMSTATROW + 10, VMSTATCOL, 9);
+ PUTRATE(v_pdpages, VMSTATROW + 11, VMSTATCOL, 9);
+ PUTRATE(v_intrans, VMSTATROW + 12, VMSTATCOL, 9);
if (extended_vm_stats) {
- PUTRATE(Cnt.v_zfod, VMSTATROW + 11, VMSTATCOL - 16, 9);
- PUTRATE(Cnt.v_ozfod, VMSTATROW + 12, VMSTATCOL - 16, 9);
+ PUTRATE(v_zfod, VMSTATROW + 11, VMSTATCOL - 16, 9);
+ PUTRATE(v_ozfod, VMSTATROW + 12, VMSTATCOL - 16, 9);
putint(
- ((s.Cnt.v_ozfod < s.Cnt.v_zfod) ?
- s.Cnt.v_ozfod * 100 / s.Cnt.v_zfod :
+ ((s.v_ozfod < s.v_zfod) ?
+ s.v_ozfod * 100 / s.v_zfod :
0
),
VMSTATROW + 13,
VMSTATCOL - 16,
9
);
- PUTRATE(Cnt.v_tfree, VMSTATROW + 14, VMSTATCOL - 16, 9);
+ PUTRATE(v_tfree, VMSTATROW + 14, VMSTATCOL - 16, 9);
}
putint(s.bufspace/1024, VMSTATROW + 13, VMSTATCOL, 9);
@@ -504,20 +509,20 @@ showkre()
putint(s.desiredvnodes, VMSTATROW + 15, VMSTATCOL, 9);
putint(s.numvnodes, VMSTATROW + 16, VMSTATCOL, 9);
putint(s.freevnodes, VMSTATROW + 17, VMSTATCOL, 9);
- PUTRATE(Cnt.v_vnodein, PAGEROW + 2, PAGECOL + 5, 5);
- PUTRATE(Cnt.v_vnodeout, PAGEROW + 2, PAGECOL + 10, 5);
- PUTRATE(Cnt.v_swapin, PAGEROW + 2, PAGECOL + 17, 5);
- PUTRATE(Cnt.v_swapout, PAGEROW + 2, PAGECOL + 22, 5);
- PUTRATE(Cnt.v_vnodepgsin, PAGEROW + 3, PAGECOL + 5, 5);
- PUTRATE(Cnt.v_vnodepgsout, PAGEROW + 3, PAGECOL + 10, 5);
- PUTRATE(Cnt.v_swappgsin, PAGEROW + 3, PAGECOL + 17, 5);
- PUTRATE(Cnt.v_swappgsout, PAGEROW + 3, PAGECOL + 22, 5);
- PUTRATE(Cnt.v_swtch, GENSTATROW + 1, GENSTATCOL, 5);
- PUTRATE(Cnt.v_trap, GENSTATROW + 1, GENSTATCOL + 5, 5);
- PUTRATE(Cnt.v_syscall, GENSTATROW + 1, GENSTATCOL + 10, 5);
- PUTRATE(Cnt.v_intr, GENSTATROW + 1, GENSTATCOL + 15, 5);
- PUTRATE(Cnt.v_soft, GENSTATROW + 1, GENSTATCOL + 20, 5);
- PUTRATE(Cnt.v_vm_faults, GENSTATROW + 1, GENSTATCOL + 25, 5);
+ PUTRATE(v_vnodein, PAGEROW + 2, PAGECOL + 5, 5);
+ PUTRATE(v_vnodeout, PAGEROW + 2, PAGECOL + 10, 5);
+ PUTRATE(v_swapin, PAGEROW + 2, PAGECOL + 17, 5);
+ PUTRATE(v_swapout, PAGEROW + 2, PAGECOL + 22, 5);
+ PUTRATE(v_vnodepgsin, PAGEROW + 3, PAGECOL + 5, 5);
+ PUTRATE(v_vnodepgsout, PAGEROW + 3, PAGECOL + 10, 5);
+ PUTRATE(v_swappgsin, PAGEROW + 3, PAGECOL + 17, 5);
+ PUTRATE(v_swappgsout, PAGEROW + 3, PAGECOL + 22, 5);
+ PUTRATE(v_swtch, GENSTATROW + 1, GENSTATCOL, 5);
+ PUTRATE(v_trap, GENSTATROW + 1, GENSTATCOL + 5, 5);
+ PUTRATE(v_syscall, GENSTATROW + 1, GENSTATCOL + 10, 5);
+ PUTRATE(v_intr, GENSTATROW + 1, GENSTATCOL + 15, 5);
+ PUTRATE(v_soft, GENSTATROW + 1, GENSTATCOL + 20, 5);
+ PUTRATE(v_vm_faults, GENSTATROW + 1, GENSTATCOL + 25, 5);
mvprintw(DISKROW, DISKCOL + 5, " ");
for (i = 0, c = 0; i < num_devices && c < MAXDRIVES; i++)
if (dev_select[i].selected) {
@@ -721,51 +726,48 @@ getinfo(s, st)
enum state st;
{
struct devinfo *tmp_dinfo;
- size_t len, size;
- int mib[2], err;
-
- len = sizeof(s->time);
- err = sysctlbyname("kern.cp_time", &s->time, &len, NULL, 0);
- if (err || len != sizeof(s->time))
- perror("kern.cp_time");
-
- len = sizeof(cur.cp_time);
- err = sysctlbyname("kern.cp_time", &cur.cp_time, &len, NULL, 0);
- if (err || len != sizeof(cur.cp_time))
- perror("kern.cp_time");
-
- NREAD(X_CNT, &s->Cnt, sizeof s->Cnt);
-
- len = sizeof(s->bufspace);
- err = sysctlbyname("vfs.bufspace", &s->bufspace, &len, NULL, 0);
- if (err || len != sizeof(s->bufspace))
- perror("vfs.bufspace");
-
- len = sizeof(s->desiredvnodes);
- err = sysctlbyname("kern.maxvnodes", &s->desiredvnodes, &len, NULL, 0);
- if (err || len != sizeof(s->desiredvnodes))
- perror("kern.maxvnodes");
-
- len = sizeof(s->numvnodes);
- err = sysctlbyname("debug.numvnodes", &s->numvnodes, &len, NULL, 0);
- if (err || len != sizeof(s->numvnodes))
- perror("debug.numvnodes");
-
- len = sizeof(s->freevnodes);
- err = sysctlbyname("debug.freevnodes", &s->freevnodes, &len, NULL, 0);
- if (err || len != sizeof(s->freevnodes))
- perror("debug.freevnodes");
-
- len = sizeof(s->nchstats);
- err = sysctlbyname("vfs.cache.nchstats", &s->nchstats, &len, NULL, 0);
- if (err || len != sizeof(s->nchstats))
- perror("vfs.cache.nchstats");
-
- NREAD(X_INTRCNT, s->intrcnt, nintr * LONG);
-
- len = sizeof(s->numdirtybuffers);
- err = sysctlbyname("vfs.numdirtybuffers", &s->numdirtybuffers, &len,
- NULL, 0);
+ size_t size;
+ int mib[2];
+
+ GETSYSCTL("kern.cp_time", s->time);
+ GETSYSCTL("kern.cp_time", cur.cp_time);
+ GETSYSCTL("vm.stats.sys.v_swtch", s->v_swtch);
+ GETSYSCTL("vm.stats.sys.v_trap", s->v_trap);
+ GETSYSCTL("vm.stats.sys.v_syscall", s->v_syscall);
+ GETSYSCTL("vm.stats.sys.v_intr", s->v_intr);
+ GETSYSCTL("vm.stats.sys.v_soft", s->v_soft);
+ GETSYSCTL("vm.stats.vm.v_vm_faults", s->v_vm_faults);
+ GETSYSCTL("vm.stats.vm.v_cow_faults", s->v_cow_faults);
+ GETSYSCTL("vm.stats.vm.v_zfod", s->v_zfod);
+ GETSYSCTL("vm.stats.vm.v_ozfod", s->v_ozfod);
+ GETSYSCTL("vm.stats.vm.v_swapin", s->v_swapin);
+ GETSYSCTL("vm.stats.vm.v_swapout", s->v_swapout);
+ GETSYSCTL("vm.stats.vm.v_swappgsin", s->v_swappgsin);
+ GETSYSCTL("vm.stats.vm.v_swappgsout", s->v_swappgsout);
+ GETSYSCTL("vm.stats.vm.v_vnodein", s->v_vnodein);
+ GETSYSCTL("vm.stats.vm.v_vnodeout", s->v_vnodeout);
+ GETSYSCTL("vm.stats.vm.v_vnodepgsin", s->v_vnodepgsin);
+ GETSYSCTL("vm.stats.vm.v_vnodepgsout", s->v_vnodepgsout);
+ GETSYSCTL("vm.stats.vm.v_intrans", s->v_intrans);
+ GETSYSCTL("vm.stats.vm.v_reactivated", s->v_reactivated);
+ GETSYSCTL("vm.stats.vm.v_pdwakeups", s->v_pdwakeups);
+ GETSYSCTL("vm.stats.vm.v_pdpages", s->v_pdpages);
+ GETSYSCTL("vm.stats.vm.v_dfree", s->v_dfree);
+ GETSYSCTL("vm.stats.vm.v_pfree", s->v_pfree);
+ GETSYSCTL("vm.stats.vm.v_tfree", s->v_tfree);
+ GETSYSCTL("vm.stats.vm.v_page_size", s->v_page_size);
+ GETSYSCTL("vm.stats.vm.v_free_count", s->v_free_count);
+ GETSYSCTL("vm.stats.vm.v_wire_count", s->v_wire_count);
+ GETSYSCTL("vm.stats.vm.v_active_count", s->v_active_count);
+ GETSYSCTL("vm.stats.vm.v_inactive_count", s->v_inactive_count);
+ GETSYSCTL("vm.stats.vm.v_cache_count", s->v_cache_count);
+ GETSYSCTL("vfs.bufspace", s->bufspace);
+ GETSYSCTL("kern.maxvnodes", s->desiredvnodes);
+ GETSYSCTL("debug.numvnodes", s->numvnodes);
+ GETSYSCTL("debug.freevnodes", s->freevnodes);
+ GETSYSCTL("vfs.cache.nchstats", s->nchstats);
+ GETSYSCTL("vfs.numdirtybuffers", s->numdirtybuffers);
+ getsysctl("hw.intrcnt", s->intrcnt, nintr * LONG);
size = sizeof(s->Total);
mib[0] = CTL_VM;
OpenPOWER on IntegriCloud