Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/vmstat move the time nlist fetches into their own na...



details:   https://anonhg.NetBSD.org/src/rev/a92ecf89d670
branches:  trunk
changeset: 466864:a92ecf89d670
user:      mrg <mrg%NetBSD.org@localhost>
date:      Sat Jan 04 03:09:55 2020 +0000

description:
move the time nlist fetches into their own namelist and only
fetch them when necessary.  allow for fallback uses of older
time sources if others are not present.

this stops vmstat from exiting if it can't get the addresses
of these time values it often doesn't need (eg, running kernels
use the sysctl method), which has cropped up recently wit the
removal of boottime variable.


a slighly modified version of this patch (modified to handle
the old boottime variable over the new one) works against a
netbsd-9 vmstat in -current too.

XXX: pullup

diffstat:

 usr.bin/vmstat/vmstat.c |  63 ++++++++++++++++++++++++++++--------------------
 1 files changed, 37 insertions(+), 26 deletions(-)

diffs (118 lines):

diff -r 778b4f1ef1e7 -r a92ecf89d670 usr.bin/vmstat/vmstat.c
--- a/usr.bin/vmstat/vmstat.c   Sat Jan 04 02:40:22 2020 +0000
+++ b/usr.bin/vmstat/vmstat.c   Sat Jan 04 03:09:55 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vmstat.c,v 1.231 2020/01/03 19:13:54 thorpej Exp $ */
+/* $NetBSD: vmstat.c,v 1.232 2020/01/04 03:09:55 mrg Exp $ */
 
 /*-
  * Copyright (c) 1998, 2000, 2001, 2007, 2019 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
 #if 0
 static char sccsid[] = "@(#)vmstat.c   8.2 (Berkeley) 3/1/95";
 #else
-__RCSID("$NetBSD: vmstat.c,v 1.231 2020/01/03 19:13:54 thorpej Exp $");
+__RCSID("$NetBSD: vmstat.c,v 1.232 2020/01/04 03:09:55 mrg Exp $");
 #endif
 #endif /* not lint */
 
@@ -150,27 +150,36 @@
  */
 struct nlist namelist[] =
 {
+#define        X_HZ            0
+       { .n_name = "_hz" },
+#define        X_STATHZ        1
+       { .n_name = "_stathz" },
+#define        X_NCHSTATS      2
+       { .n_name = "_nchstats" },
+#define        X_ALLEVENTS     3
+       { .n_name = "_allevents" },
+#define        X_POOLHEAD      4
+       { .n_name = "_pool_head" },
+#define        X_UVMEXP        5
+       { .n_name = "_uvmexp" },
+#define X_CPU_INFOS    6
+       { .n_name = "_cpu_infos" },
+#define        X_NL_SIZE       7
+       { .n_name = NULL },
+};
+
+/*
+ * Namelist for time data.
+ */
+struct nlist timenl[] =
+{
 #define        X_TIMEBASEBIN   0
        { .n_name = "_timebasebin" },
-#define        X_HZ            1
-       { .n_name = "_hz" },
-#define        X_STATHZ        2
-       { .n_name = "_stathz" },
-#define        X_NCHSTATS      3
-       { .n_name = "_nchstats" },
-#define        X_ALLEVENTS     4
-       { .n_name = "_allevents" },
-#define        X_POOLHEAD      5
-       { .n_name = "_pool_head" },
-#define        X_UVMEXP        6
-       { .n_name = "_uvmexp" },
-#define        X_TIME_SECOND   7
+#define        X_TIME_SECOND   1
        { .n_name = "_time_second" },
-#define X_TIME         8
+#define X_TIME         2
        { .n_name = "_time" },
-#define X_CPU_INFOS    9
-       { .n_name = "_cpu_infos" },
-#define        X_NL_SIZE       10
+#define        X_TIMENL_SIZE   3
        { .n_name = NULL },
 };
 
@@ -559,9 +568,7 @@
                                errx(1, "kvm_nlist: %s %s",
                                    "namelist", kvm_geterr(kd));
                        for (i = 0; i < __arraycount(namelist)-1; i++)
-                               if (namelist[i].n_type == 0 &&
-                                   i != X_TIME_SECOND &&
-                                   i != X_TIME) {
+                               if (namelist[i].n_type == 0) {
                                        if (doexit++ == 0)
                                                (void)fprintf(stderr,
                                                    "%s: undefined symbols:",
@@ -575,6 +582,11 @@
                        }
                }
        }
+       if ((todo & (VMSTAT|INTRSTAT)) && !(done & (VMSTAT))) {
+               done |= VMSTAT;
+               if ((c = kvm_nlist(kd, timenl)) == -1 || c == X_TIMENL_SIZE)
+                       errx(1, "kvm_nlist: %s %s", "timenl", kvm_geterr(kd));
+       }
        if ((todo & (SUMSTAT|INTRSTAT)) && !(done & (SUMSTAT|INTRSTAT))) {
                done |= SUMSTAT|INTRSTAT;
                (void) kvm_nlist(kd, intrnl);
@@ -645,11 +657,10 @@
                if (boottime.tv_sec == 0) {
                        struct bintime bt;
 
-                       kread(namelist, X_TIMEBASEBIN, &bt,
-                           sizeof(bt));
+                       kread(timenl, X_TIMEBASEBIN, &bt, sizeof(bt));
                        bintime2timespec(&bt, &boottime);
                }
-               if (kreadc(namelist, X_TIME_SECOND, &nowsec, sizeof(nowsec))) {
+               if (kreadc(timenl, X_TIME_SECOND, &nowsec, sizeof(nowsec))) {
                        /*
                         * XXX this assignment dance can be removed once
                         * timeval tv_sec is SUS mandated time_t
@@ -657,7 +668,7 @@
                        now.tv_sec = nowsec;
                        now.tv_nsec = 0;
                } else {
-                       kread(namelist, X_TIME, &now, sizeof(now));
+                       kread(timenl, X_TIME, &now, sizeof(now));
                }
        }
        uptime = now.tv_sec - boottime.tv_sec;



Home | Main Index | Thread Index | Old Index