Split the struct vmmeter cnt structure into a global vmstats structure and
authorMatthew Dillon <dillon@dragonflybsd.org>
Thu, 3 Jul 2003 18:34:00 +0000 (18:34 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Thu, 3 Jul 2003 18:34:00 +0000 (18:34 +0000)
a per-cpu cnt structure.  Adjust the sysctls to accumulate statistics
over all cpus.

(userland syncup)

usr.bin/systat/vmstat.c
usr.bin/top/machine.c
usr.bin/vmstat/vmstat.c

index ea5e877..4df8d39 100644 (file)
@@ -32,7 +32,7 @@
  *
  * @(#)vmstat.c        8.2 (Berkeley) 1/12/94
  * $FreeBSD: src/usr.bin/systat/vmstat.c,v 1.38.2.4 2002/03/12 19:50:23 phantom Exp $
- * $DragonFly: src/usr.bin/systat/vmstat.c,v 1.2 2003/06/17 04:29:32 dillon Exp $
+ * $DragonFly: src/usr.bin/systat/vmstat.c,v 1.3 2003/07/03 18:33:57 dillon Exp $
  */
 
 /*
@@ -70,8 +70,9 @@
 
 static struct Info {
        long    time[CPUSTATES];
-       struct  vmmeter Cnt;
+       struct  vmmeter Vmm;
        struct  vmtotal Total;
+       struct  vmstats Vms;
        struct  nchstats nchstats;
        long    nchcount;
        long    *intrcnt;
@@ -84,8 +85,10 @@ static struct Info {
 
 struct statinfo cur, last, run;
 
-#define        cnt s.Cnt
-#define oldcnt s1.Cnt
+#define        vmm s.Vmm
+#define        vms s.Vms
+#define oldvmm s1.Vmm
+#define oldvms s1.Vms
 #define        total s.Total
 #define        nchtotal s.nchstats
 #define        oldnchtotal s1.nchstats
@@ -142,27 +145,25 @@ closekre(w)
 static struct nlist namelist[] = {
 #define X_CPTIME       0
        { "_cp_time" },
-#define X_CNT          1
-       { "_cnt" },
-#define        X_BUFFERSPACE   2
+#define        X_BUFFERSPACE   1
        { "_bufspace" },
-#define        X_NCHSTATS      3
+#define        X_NCHSTATS      2
        { "_nchstats" },
-#define        X_INTRNAMES     4
+#define        X_INTRNAMES     3
        { "_intrnames" },
-#define        X_EINTRNAMES    5
+#define        X_EINTRNAMES    4
        { "_eintrnames" },
-#define        X_INTRCNT       6
+#define        X_INTRCNT       5
        { "_intrcnt" },
-#define        X_EINTRCNT      7
+#define        X_EINTRCNT      6
        { "_eintrcnt" },
-#define        X_DESIREDVNODES 8
+#define        X_DESIREDVNODES 7
        { "_desiredvnodes" },
-#define        X_NUMVNODES     9
+#define        X_NUMVNODES     8
        { "_numvnodes" },
-#define        X_FREEVNODES    10
+#define        X_FREEVNODES    9
        { "_freevnodes" },
-#define X_NUMDIRTYBUFFERS 11
+#define X_NUMDIRTYBUFFERS 10
        { "_numdirtybuffers" },
        { "" },
 };
@@ -463,7 +464,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) * vms.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);
@@ -479,34 +480,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(Vmm.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(Vmm.v_cow_faults, VMSTATROW + 1, VMSTATCOL + 3, 6);
+       putint(pgtokb(vms.v_wire_count), VMSTATROW + 2, VMSTATCOL, 9);
+       putint(pgtokb(vms.v_active_count), VMSTATROW + 3, VMSTATCOL, 9);
+       putint(pgtokb(vms.v_inactive_count), VMSTATROW + 4, VMSTATCOL, 9);
+       putint(pgtokb(vms.v_cache_count), VMSTATROW + 5, VMSTATCOL, 9);
+       putint(pgtokb(vms.v_free_count), VMSTATROW + 6, VMSTATCOL, 9);
+       PUTRATE(Vmm.v_dfree, VMSTATROW + 7, VMSTATCOL, 9);
+       PUTRATE(Vmm.v_pfree, VMSTATROW + 8, VMSTATCOL, 9);
+       PUTRATE(Vmm.v_reactivated, VMSTATROW + 9, VMSTATCOL, 9);
+       PUTRATE(Vmm.v_pdwakeups, VMSTATROW + 10, VMSTATCOL, 9);
+       PUTRATE(Vmm.v_pdpages, VMSTATROW + 11, VMSTATCOL, 9);
+       PUTRATE(Vmm.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(Vmm.v_zfod, VMSTATROW + 11, VMSTATCOL - 16, 9);
+           PUTRATE(Vmm.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.Vmm.v_ozfod < s.Vmm.v_zfod) ?
+                   s.Vmm.v_ozfod * 100 / s.Vmm.v_zfod : 
                    0
                ),
                VMSTATROW + 13, 
                VMSTATCOL - 16,
                9
            );
-           PUTRATE(Cnt.v_tfree, VMSTATROW + 14, VMSTATCOL - 16, 9);
+           PUTRATE(Vmm.v_tfree, VMSTATROW + 14, VMSTATCOL - 16, 9);
        }
 
        putint(s.bufspace/1024, VMSTATROW + 13, VMSTATCOL, 9);
@@ -514,20 +515,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(Vmm.v_vnodein, PAGEROW + 2, PAGECOL + 5, 5);
+       PUTRATE(Vmm.v_vnodeout, PAGEROW + 2, PAGECOL + 10, 5);
+       PUTRATE(Vmm.v_swapin, PAGEROW + 2, PAGECOL + 17, 5);
+       PUTRATE(Vmm.v_swapout, PAGEROW + 2, PAGECOL + 22, 5);
+       PUTRATE(Vmm.v_vnodepgsin, PAGEROW + 3, PAGECOL + 5, 5);
+       PUTRATE(Vmm.v_vnodepgsout, PAGEROW + 3, PAGECOL + 10, 5);
+       PUTRATE(Vmm.v_swappgsin, PAGEROW + 3, PAGECOL + 17, 5);
+       PUTRATE(Vmm.v_swappgsout, PAGEROW + 3, PAGECOL + 22, 5);
+       PUTRATE(Vmm.v_swtch, GENSTATROW + 1, GENSTATCOL, 5);
+       PUTRATE(Vmm.v_trap, GENSTATROW + 1, GENSTATCOL + 5, 5);
+       PUTRATE(Vmm.v_syscall, GENSTATROW + 1, GENSTATCOL + 10, 5);
+       PUTRATE(Vmm.v_intr, GENSTATROW + 1, GENSTATCOL + 15, 5);
+       PUTRATE(Vmm.v_soft, GENSTATROW + 1, GENSTATCOL + 20, 5);
+       PUTRATE(Vmm.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) {
@@ -733,10 +734,20 @@ getinfo(s, st)
        struct devinfo *tmp_dinfo;
        size_t size;
        int mib[2];
+       int vms_size = sizeof(s->Vms);
+       int vmm_size = sizeof(s->Vmm);
+
+        if (sysctlbyname("vm.vmstats", &s->Vms, &vms_size, NULL, 0)) {
+                perror("sysctlbyname: vm.vmstats");
+                exit(1);
+        }
+        if (sysctlbyname("vm.vmmeter", &s->Vmm, &vmm_size, NULL, 0)) {
+                perror("sysctlbyname: vm.vmstats");
+                exit(1);
+        }
 
        NREAD(X_CPTIME, s->time, sizeof s->time);
        NREAD(X_CPTIME, cur.cp_time, sizeof(cur.cp_time));
-       NREAD(X_CNT, &s->Cnt, sizeof s->Cnt);
        NREAD(X_BUFFERSPACE, &s->bufspace, sizeof(s->bufspace));
        NREAD(X_DESIREDVNODES, &s->desiredvnodes, sizeof(s->desiredvnodes));
        NREAD(X_NUMVNODES, &s->numvnodes, LONG);
@@ -745,9 +756,7 @@ getinfo(s, st)
        NREAD(X_INTRCNT, s->intrcnt, nintr * LONG);
        NREAD(X_NUMDIRTYBUFFERS, &s->numdirtybuffers, sizeof(s->numdirtybuffers));
        size = sizeof(s->Total);
-       mib[0] = CTL_VM;
-       mib[1] = VM_METER;
-       if (sysctl(mib, 2, &s->Total, &size, NULL, 0) < 0) {
+       if (sysctlbyname("vm.vmtotal", &s->Total, &size, NULL, 0) < 0) {
                error("Can't get kernel info: %s\n", strerror(errno));
                bzero(&s->Total, sizeof(s->Total));
        }
index f9b672f..63a2c52 100644 (file)
@@ -20,7 +20,7 @@
  *          Wolfram Schneider <wosch@FreeBSD.org>
  *
  * $FreeBSD: src/usr.bin/top/machine.c,v 1.29.2.2 2001/07/31 20:27:05 tmm Exp $
- * $DragonFly: src/usr.bin/top/machine.c,v 1.4 2003/07/01 00:19:36 dillon Exp $
+ * $DragonFly: src/usr.bin/top/machine.c,v 1.5 2003/07/03 18:33:58 dillon Exp $
  */
 
 
@@ -99,11 +99,9 @@ static struct nlist nlst[] = {
 
 #define X_BUFSPACE     3
        { "_bufspace" },        /* K in buffer cache */
-#define X_CNT           4
-    { "_cnt" },                        /* struct vmmeter cnt */
 
 /* Last pid */
-#define X_LASTPID      5
+#define X_LASTPID      4
     { "_nextpid" },            
     { 0 }
 };
@@ -152,7 +150,6 @@ static unsigned long cp_time_offset;
 static unsigned long avenrun_offset;
 static unsigned long lastpid_offset;
 static long lastpid;
-static unsigned long cnt_offset;
 static unsigned long bufspace_offset;
 static long cnt;
 
@@ -273,7 +270,6 @@ struct statics *statics;
     cp_time_offset = nlst[X_CP_TIME].n_value;
     avenrun_offset = nlst[X_AVENRUN].n_value;
     lastpid_offset =  nlst[X_LASTPID].n_value;
-    cnt_offset = nlst[X_CNT].n_value;
     bufspace_offset = nlst[X_BUFSPACE].n_value;
 
     /* this is used in calculating WCPU -- calculate it ahead of time */
@@ -377,24 +373,33 @@ struct system_info *si;
 
     /* sum memory & swap statistics */
     {
-       struct vmmeter sum;
+       struct vmmeter vmm;
+       struct vmstats vms;
+       int vms_size = sizeof(vms);
+       int vmm_size = sizeof(vmm);
        static unsigned int swap_delay = 0;
        static int swapavail = 0;
        static int swapfree = 0;
        static int bufspace = 0;
 
-        (void) getkval(cnt_offset, (int *)(&sum), sizeof(sum),
-                  "_cnt");
+       if (sysctlbyname("vm.vmstats", &vms, &vms_size, NULL, 0)) {
+               perror("sysctlbyname: vm.vmstats");
+               exit(1);
+       }
+       if (sysctlbyname("vm.vmmeter", &vmm, &vmm_size, NULL, 0)) {
+               perror("sysctlbyname: vm.vmstats");
+               exit(1);
+       }
         (void) getkval(bufspace_offset, (int *)(&bufspace), sizeof(bufspace),
                   "_bufspace");
 
        /* convert memory stats to Kbytes */
-       memory_stats[0] = pagetok(sum.v_active_count);
-       memory_stats[1] = pagetok(sum.v_inactive_count);
-       memory_stats[2] = pagetok(sum.v_wire_count);
-       memory_stats[3] = pagetok(sum.v_cache_count);
+       memory_stats[0] = pagetok(vms.v_active_count);
+       memory_stats[1] = pagetok(vms.v_inactive_count);
+       memory_stats[2] = pagetok(vms.v_wire_count);
+       memory_stats[3] = pagetok(vms.v_cache_count);
        memory_stats[4] = bufspace / 1024;
-       memory_stats[5] = pagetok(sum.v_free_count);
+       memory_stats[5] = pagetok(vms.v_free_count);
        memory_stats[6] = -1;
 
        /* first interval */
@@ -405,12 +410,12 @@ struct system_info *si;
 
        /* compute differences between old and new swap statistic */
        else {
-           swap_stats[4] = pagetok(((sum.v_swappgsin - swappgsin)));
-           swap_stats[5] = pagetok(((sum.v_swappgsout - swappgsout)));
+           swap_stats[4] = pagetok(((vmm.v_swappgsin - swappgsin)));
+           swap_stats[5] = pagetok(((vmm.v_swappgsout - swappgsout)));
        }
 
-        swappgsin = sum.v_swappgsin;
-       swappgsout = sum.v_swappgsout;
+        swappgsin = vmm.v_swappgsin;
+       swappgsout = vmm.v_swappgsout;
 
        /* call CPU heavy swapmode() only for changes */
         if (swap_stats[4] > 0 || swap_stats[5] > 0 || swap_delay == 0) {
@@ -587,9 +592,11 @@ char *(*get_userid)();
     /* generate "STATE" field */
     switch (state = PP(pp, p_stat)) {
        case SRUN:
+#if 0
            if (smpmode && PP(pp, p_oncpu) != 0xff)
                sprintf(status, "CPU%d", PP(pp, p_oncpu));
            else
+#endif
                strcpy(status, "RUN");
            break;
        case SSLEEP:
@@ -641,7 +648,10 @@ char *(*get_userid)();
            format_k2(PROCSIZE(pp)),
            format_k2(pagetok(VP(pp, vm_rssize))),
            status,
+#if 0
            smpmode ? PP(pp, p_lastcpu) : 0,
+#endif
+           0,
            format_time(cputime),
            100.0 * weighted_cpu(pct, pp),
            100.0 * pct,
index 1524948..862c46f 100644 (file)
@@ -33,7 +33,7 @@
  * @(#) Copyright (c) 1980, 1986, 1991, 1993 The Regents of the University of California.  All rights reserved.
  * @(#)vmstat.c        8.1 (Berkeley) 6/6/93
  * $FreeBSD: src/usr.bin/vmstat/vmstat.c,v 1.38.2.4 2001/07/31 19:52:41 tmm Exp $
- * $DragonFly: src/usr.bin/vmstat/vmstat.c,v 1.2 2003/06/17 04:29:33 dillon Exp $
+ * $DragonFly: src/usr.bin/vmstat/vmstat.c,v 1.3 2003/07/03 18:34:00 dillon Exp $
  */
 
 #include <sys/param.h>
 struct nlist namelist[] = {
 #define        X_CPTIME        0
        { "_cp_time" },
-#define X_SUM          1
-       { "_cnt" },
-#define        X_BOOTTIME      2
+#define        X_BOOTTIME      1
        { "_boottime" },
-#define X_HZ           3
+#define X_HZ           2
        { "_hz" },
-#define X_STATHZ       4
+#define X_STATHZ       3
        { "_stathz" },
-#define X_NCHSTATS     5
+#define X_NCHSTATS     4
        { "_nchstats" },
-#define        X_INTRNAMES     6
+#define        X_INTRNAMES     5
        { "_intrnames" },
-#define        X_EINTRNAMES    7
+#define        X_EINTRNAMES    6
        { "_eintrnames" },
 #define        X_INTRCNT       8
        { "_intrcnt" },
-#define        X_EINTRCNT      9
+#define        X_EINTRCNT      8
        { "_eintrcnt" },
-#define        X_KMEMSTATISTICS        10
+#define        X_KMEMSTATISTICS        9
        { "_kmemstatistics" },
-#define        X_KMEMBUCKETS   11
+#define        X_KMEMBUCKETS   10
        { "_bucket" },
-#define        X_ZLIST         12
+#define        X_ZLIST         11
        { "_zlist" },
 #ifdef notyet
-#define        X_DEFICIT       13
+#define        X_DEFICIT       12
        { "_deficit" },
-#define        X_FORKSTAT      14
+#define        X_FORKSTAT      13
        { "_forkstat" },
-#define X_REC          15
+#define X_REC          14
        { "_rectime" },
-#define X_PGIN         16
+#define X_PGIN         15
        { "_pgintime" },
-#define        X_XSTATS        17
+#define        X_XSTATS        16
        { "_xstats" },
-#define X_END          18
+#define X_END          17
 #else
-#define X_END          13
+#define X_END          18
 #endif
        { "" },
 };
@@ -123,7 +121,8 @@ long select_generation;
 char **specified_devices;
 devstat_select_mode select_mode;
 
-struct vmmeter sum, osum;
+struct vmmeter vmm, ovmm;
+struct vmstats vms, ovms;
 
 int    winlines = 20;
 int    nflag = 0;
@@ -398,6 +397,9 @@ dovmstat(interval, reps)
        void needhdr();
        int mib[2];
        size_t size;
+       int vmm_size = sizeof(vmm);
+       int vms_size = sizeof(vms);
+       int vmt_size = sizeof(total);
 
        uptime = getuptime();
        halfuptime = uptime / 2;
@@ -457,45 +459,49 @@ dovmstat(interval, reps)
                        break;
                }
 
-               kread(X_SUM, &sum, sizeof(sum));
-               size = sizeof(total);
-               mib[0] = CTL_VM;
-               mib[1] = VM_METER;
-               if (sysctl(mib, 2, &total, &size, NULL, 0) < 0) {
-                       printf("Can't get kerninfo: %s\n", strerror(errno));
-                       bzero(&total, sizeof(total));
+               if (sysctlbyname("vm.vmstats", &vms, &vms_size, NULL, 0)) {
+                       perror("sysctlbyname: vm.vmstats");
+                       exit(1);
                }
+               if (sysctlbyname("vm.vmmeter", &vmm, &vmm_size, NULL, 0)) {
+                       perror("sysctlbyname: vm.vmstats");
+                       exit(1);
+               } 
+               if (sysctlbyname("vm.vmtotal", &total, &vmt_size, NULL, 0)) {
+                       perror("sysctlbyname: vm.vmtotal");
+                       exit(1);
+               } 
                (void)printf("%2d %1d %1d",
                    total.t_rq - 1, total.t_dw + total.t_pw, total.t_sw);
-#define vmstat_pgtok(a) ((a) * sum.v_page_size >> 10)
+#define vmstat_pgtok(a) ((a) * vms.v_page_size >> 10)
 #define        rate(x) (((x) + halfuptime) / uptime)   /* round */
                (void)printf(" %7ld %6ld ",
                    (long)vmstat_pgtok(total.t_avm), (long)vmstat_pgtok(total.t_free));
                (void)printf("%4lu ",
-                   (u_long)rate(sum.v_vm_faults - osum.v_vm_faults));
+                   (u_long)rate(vmm.v_vm_faults - ovmm.v_vm_faults));
                (void)printf("%3lu ",
-                   (u_long)rate(sum.v_reactivated - osum.v_reactivated));
+                   (u_long)rate(vmm.v_reactivated - ovmm.v_reactivated));
                (void)printf("%3lu ",
-                   (u_long)rate(sum.v_swapin + sum.v_vnodein -
-                   (osum.v_swapin + osum.v_vnodein)));
+                   (u_long)rate(vmm.v_swapin + vmm.v_vnodein -
+                   (ovmm.v_swapin + ovmm.v_vnodein)));
                (void)printf("%3lu ",
-                   (u_long)rate(sum.v_swapout + sum.v_vnodeout -
-                   (osum.v_swapout + osum.v_vnodeout)));
+                   (u_long)rate(vmm.v_swapout + vmm.v_vnodeout -
+                   (ovmm.v_swapout + ovmm.v_vnodeout)));
                (void)printf("%3lu ",
-                   (u_long)rate(sum.v_tfree - osum.v_tfree));
+                   (u_long)rate(vmm.v_tfree - ovmm.v_tfree));
                (void)printf("%3lu ",
-                   (u_long)rate(sum.v_pdpages - osum.v_pdpages));
+                   (u_long)rate(vmm.v_pdpages - ovmm.v_pdpages));
                devstats();
                (void)printf("%4lu %4lu %3lu ",
-                   (u_long)rate(sum.v_intr - osum.v_intr),
-                   (u_long)rate(sum.v_syscall - osum.v_syscall),
-                   (u_long)rate(sum.v_swtch - osum.v_swtch));
+                   (u_long)rate(vmm.v_intr - ovmm.v_intr),
+                   (u_long)rate(vmm.v_syscall - ovmm.v_syscall),
+                   (u_long)rate(vmm.v_swtch - ovmm.v_swtch));
                cpustats();
                (void)printf("\n");
                (void)fflush(stdout);
                if (reps >= 0 && --reps <= 0)
                        break;
-               osum = sum;
+               ovmm = vmm;
                uptime = interval;
                /*
                 * We round upward to avoid losing low-frequency events
@@ -542,26 +548,6 @@ needhdr()
        hdrcnt = 1;
 }
 
-#ifdef notyet
-void
-dotimes()
-{
-       u_int pgintime, rectime;
-
-       kread(X_REC, &rectime, sizeof(rectime));
-       kread(X_PGIN, &pgintime, sizeof(pgintime));
-       kread(X_SUM, &sum, sizeof(sum));
-       (void)printf("%u reclaims, %u total time (usec)\n",
-           sum.v_pgrec, rectime);
-       (void)printf("average: %u usec / reclaim\n", rectime / sum.v_pgrec);
-       (void)printf("\n");
-       (void)printf("%u page ins, %u total time (msec)\n",
-           sum.v_pgin, pgintime / 10);
-       (void)printf("average: %8.1f msec / page in\n",
-           pgintime / (sum.v_pgin * 10.0));
-}
-#endif
-
 long
 pct(top, bot)
        long top, bot;
@@ -581,47 +567,56 @@ dosum()
 {
        struct nchstats nchstats;
        long nchtotal;
+       int vms_size = sizeof(vms);
+       int vmm_size = sizeof(vmm);
 
-       kread(X_SUM, &sum, sizeof(sum));
-       (void)printf("%9u cpu context switches\n", sum.v_swtch);
-       (void)printf("%9u device interrupts\n", sum.v_intr);
-       (void)printf("%9u software interrupts\n", sum.v_soft);
-       (void)printf("%9u traps\n", sum.v_trap);
-       (void)printf("%9u system calls\n", sum.v_syscall);
-       (void)printf("%9u kernel threads created\n", sum.v_kthreads);
-       (void)printf("%9u  fork() calls\n", sum.v_forks);
-       (void)printf("%9u vfork() calls\n", sum.v_vforks);
-       (void)printf("%9u rfork() calls\n", sum.v_rforks);
-       (void)printf("%9u swap pager pageins\n", sum.v_swapin);
-       (void)printf("%9u swap pager pages paged in\n", sum.v_swappgsin);
-       (void)printf("%9u swap pager pageouts\n", sum.v_swapout);
-       (void)printf("%9u swap pager pages paged out\n", sum.v_swappgsout);
-       (void)printf("%9u vnode pager pageins\n", sum.v_vnodein);
-       (void)printf("%9u vnode pager pages paged in\n", sum.v_vnodepgsin);
-       (void)printf("%9u vnode pager pageouts\n", sum.v_vnodeout);
-       (void)printf("%9u vnode pager pages paged out\n", sum.v_vnodepgsout);
-       (void)printf("%9u page daemon wakeups\n", sum.v_pdwakeups);
-       (void)printf("%9u pages examined by the page daemon\n", sum.v_pdpages);
-       (void)printf("%9u pages reactivated\n", sum.v_reactivated);
-       (void)printf("%9u copy-on-write faults\n", sum.v_cow_faults);
-       (void)printf("%9u copy-on-write optimized faults\n", sum.v_cow_optim);
-       (void)printf("%9u zero fill pages zeroed\n", sum.v_zfod);
-       (void)printf("%9u zero fill pages prezeroed\n", sum.v_ozfod);
-       (void)printf("%9u intransit blocking page faults\n", sum.v_intrans);
-       (void)printf("%9u total VM faults taken\n", sum.v_vm_faults);
-       (void)printf("%9u pages affected by kernel thread creation\n", sum.v_kthreadpages);
-       (void)printf("%9u pages affected by  fork()\n", sum.v_forkpages);
-       (void)printf("%9u pages affected by vfork()\n", sum.v_vforkpages);
-       (void)printf("%9u pages affected by rfork()\n", sum.v_rforkpages);
-       (void)printf("%9u pages freed\n", sum.v_tfree);
-       (void)printf("%9u pages freed by daemon\n", sum.v_dfree);
-       (void)printf("%9u pages freed by exiting processes\n", sum.v_pfree);
-       (void)printf("%9u pages active\n", sum.v_active_count);
-       (void)printf("%9u pages inactive\n", sum.v_inactive_count);
-       (void)printf("%9u pages in VM cache\n", sum.v_cache_count);
-       (void)printf("%9u pages wired down\n", sum.v_wire_count);
-       (void)printf("%9u pages free\n", sum.v_free_count);
-       (void)printf("%9u bytes per page\n", sum.v_page_size);
+       if (sysctlbyname("vm.vmstats", &vms, &vms_size, NULL, 0)) {
+               perror("sysctlbyname: vm.vmstats");
+               exit(1);
+       }
+       if (sysctlbyname("vm.vmmeter", &vmm, &vmm_size, NULL, 0)) {
+               perror("sysctlbyname: vm.vmstats");
+               exit(1);
+       } 
+       (void)printf("%9u cpu context switches\n", vmm.v_swtch);
+       (void)printf("%9u device interrupts\n", vmm.v_intr);
+       (void)printf("%9u software interrupts\n", vmm.v_soft);
+       (void)printf("%9u traps\n", vmm.v_trap);
+       (void)printf("%9u system calls\n", vmm.v_syscall);
+       (void)printf("%9u kernel threads created\n", vmm.v_kthreads);
+       (void)printf("%9u  fork() calls\n", vmm.v_forks);
+       (void)printf("%9u vfork() calls\n", vmm.v_vforks);
+       (void)printf("%9u rfork() calls\n", vmm.v_rforks);
+       (void)printf("%9u swap pager pageins\n", vmm.v_swapin);
+       (void)printf("%9u swap pager pages paged in\n", vmm.v_swappgsin);
+       (void)printf("%9u swap pager pageouts\n", vmm.v_swapout);
+       (void)printf("%9u swap pager pages paged out\n", vmm.v_swappgsout);
+       (void)printf("%9u vnode pager pageins\n", vmm.v_vnodein);
+       (void)printf("%9u vnode pager pages paged in\n", vmm.v_vnodepgsin);
+       (void)printf("%9u vnode pager pageouts\n", vmm.v_vnodeout);
+       (void)printf("%9u vnode pager pages paged out\n", vmm.v_vnodepgsout);
+       (void)printf("%9u page daemon wakeups\n", vmm.v_pdwakeups);
+       (void)printf("%9u pages examined by the page daemon\n", vmm.v_pdpages);
+       (void)printf("%9u pages reactivated\n", vmm.v_reactivated);
+       (void)printf("%9u copy-on-write faults\n", vmm.v_cow_faults);
+       (void)printf("%9u copy-on-write optimized faults\n", vmm.v_cow_optim);
+       (void)printf("%9u zero fill pages zeroed\n", vmm.v_zfod);
+       (void)printf("%9u zero fill pages prezeroed\n", vmm.v_ozfod);
+       (void)printf("%9u intransit blocking page faults\n", vmm.v_intrans);
+       (void)printf("%9u total VM faults taken\n", vmm.v_vm_faults);
+       (void)printf("%9u pages affected by kernel thread creation\n", vmm.v_kthreadpages);
+       (void)printf("%9u pages affected by  fork()\n", vmm.v_forkpages);
+       (void)printf("%9u pages affected by vfork()\n", vmm.v_vforkpages);
+       (void)printf("%9u pages affected by rfork()\n", vmm.v_rforkpages);
+       (void)printf("%9u pages freed\n", vmm.v_tfree);
+       (void)printf("%9u pages freed by daemon\n", vmm.v_dfree);
+       (void)printf("%9u pages freed by exiting processes\n", vmm.v_pfree);
+       (void)printf("%9u pages active\n", vms.v_active_count);
+       (void)printf("%9u pages inactive\n", vms.v_inactive_count);
+       (void)printf("%9u pages in VM cache\n", vms.v_cache_count);
+       (void)printf("%9u pages wired down\n", vms.v_wire_count);
+       (void)printf("%9u pages free\n", vms.v_free_count);
+       (void)printf("%9u bytes per page\n", vms.v_page_size);
        kread(X_NCHSTATS, &nchstats, sizeof(nchstats));
        nchtotal = nchstats.ncs_goodhits + nchstats.ncs_neghits +
            nchstats.ncs_badhits + nchstats.ncs_falsehits +