Module Name:    src
Committed By:   mrg
Date:           Sat Jan  4 03:09:55 UTC 2020

Modified Files:
        src/usr.bin/vmstat: vmstat.c

Log Message:
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


To generate a diff of this commit:
cvs rdiff -u -r1.231 -r1.232 src/usr.bin/vmstat/vmstat.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/vmstat/vmstat.c
diff -u src/usr.bin/vmstat/vmstat.c:1.231 src/usr.bin/vmstat/vmstat.c:1.232
--- src/usr.bin/vmstat/vmstat.c:1.231	Fri Jan  3 19:13:54 2020
+++ src/usr.bin/vmstat/vmstat.c	Sat Jan  4 03:09:55 2020
@@ -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 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 19
 #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 cpu_info {
  */
 struct nlist namelist[] =
 {
-#define	X_TIMEBASEBIN	0
-	{ .n_name = "_timebasebin" },
-#define	X_HZ		1
+#define	X_HZ		0
 	{ .n_name = "_hz" },
-#define	X_STATHZ	2
+#define	X_STATHZ	1
 	{ .n_name = "_stathz" },
-#define	X_NCHSTATS	3
+#define	X_NCHSTATS	2
 	{ .n_name = "_nchstats" },
-#define	X_ALLEVENTS	4
+#define	X_ALLEVENTS	3
 	{ .n_name = "_allevents" },
-#define	X_POOLHEAD	5
+#define	X_POOLHEAD	4
 	{ .n_name = "_pool_head" },
-#define	X_UVMEXP	6
+#define	X_UVMEXP	5
 	{ .n_name = "_uvmexp" },
-#define	X_TIME_SECOND	7
+#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_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 @@ getnlist(int todo)
 				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 @@ getnlist(int todo)
 			}
 		}
 	}
+	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 @@ getuptime(void)
 		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 @@ getuptime(void)
 			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;

Reply via email to