Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 8 Dec 2002 10:02:11 -0500
From:      Hiten Pandya <hiten@angelica.unixdaemons.com>
To:        freebsd-hackers@FreeBSD.org
Cc:        phk@FreeBSD.org
Subject:   System-wide totals via sysctl (struct vmtotal)
Message-ID:  <20021208150211.GA68549@angelica.unixdaemons.com>

next in thread | raw e-mail | index | archive | help

--KsGdsel6WgEHnImy
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hello Gang!

Currently, people, the vm.vmmeter sysctl is "bogus and misleading".  It
refers to struct vmtotal, which gives us the "system wide totals", and
does not relate/refer to struct vmmeter in _any_ way.

It is silently skipped by sysctl -a listing, because there is no handler
for it:

   # sysctl vm.vmmeter	# nothing returned...
   # sysctl -ao vm.vmmeter
   vm.vmmeter: Format:S,vmtotal Length:48 Dump: ....

It has been this from the days of 3.0-CURRENT, and earlier, I think. PR
kern/5689 addressed this problem.  Johan Karlsson assigned this PR to
phk@ in 2000 (submitted: 1998), but no action was taken by anyone anyway, 
and eventually, patch was left to rot.

Well, I have updated the patch for 3.0-CURRENT, for our latest -current,
and also made one more change vmmeter->vmtotal, as requested in the PR.
The patches are attached with this mail.  I would be very grateful is
someone can commit (and review) them for me.

Cheers.

P.S. http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/5689

-- 
Hiten Pandya (hiten@unixdaemons.com, hiten@uk.FreeBSD.org)
http://www.unixdaemons.com/~hiten/

--KsGdsel6WgEHnImy
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="sysctl-vmtotal.patch"

Index: sbin/sysctl/sysctl.c
===================================================================
RCS file: /home/ncvs/src/sbin/sysctl/sysctl.c,v
retrieving revision 1.48
diff -u -r1.48 sysctl.c
--- sbin/sysctl/sysctl.c	2002/11/12 21:18:21	1.48
+++ sbin/sysctl/sysctl.c	2002/12/08 14:58:56
@@ -54,6 +54,7 @@
 #include <sys/resource.h>
 #include <sys/stat.h>
 #include <sys/sysctl.h>
+#include <sys/vmmeter.h>
 
 #include <ctype.h>
 #include <err.h>
@@ -323,6 +324,29 @@
 }
 
 static int
+S_vmtotal(int l2, void *p)
+{
+	struct vmtotal *v = (struct vmtotal *)p;
+
+	if (l2 != sizeof(*v)) {
+		warnx("S_vmtotal %d != %d", l2, sizeof(*v));
+		return (0);
+	}
+
+	printf("\nSystem wide totals computed every five seconds:\n");
+	printf("===============================================\n");
+	printf("Processes: (RUNQ:\t %hu Disk Wait: %hu Page Wait: %hu Sleep: %hu)\n",
+		v->t_rq, v->t_dw, v->t_pw, v->t_sl);
+	printf("Virtual Memory:\t\t (Total: %hu Active %hu)\n", v->t_vm, v->t_avm);
+	printf("Real Memory:\t\t (Total: %hu Active %hu)\n", v->t_rm, v->t_arm);
+	printf("Shared Virtual Memory:\t (Total: %hu Active: %hu)\n", v->t_vmshr, v->t_avmshr);
+	printf("Shared Real Memory:\t (Total: %hu Active: %hu)\n", v->t_rmshr, v->t_armshr);
+	printf("Free Memory Pages:\t %hu\n", v->t_free);
+	
+	return (0);
+}
+
+static int
 T_dev_t(int l2, void *p)
 {
 	dev_t *d = (dev_t *)p;
@@ -587,6 +611,8 @@
 			func = S_timeval;
 		else if (strcmp(fmt, "S,loadavg") == 0)
 			func = S_loadavg;
+		else if (strcmp(fmt, "S,vmtotal") == 0)
+			func = S_vmtotal;
 		else if (strcmp(fmt, "T,dev_t") == 0)
 			func = T_dev_t;
 		else
Index: sys/vm/vm_meter.c
===================================================================
RCS file: /home/ncvs/src/sys/vm/vm_meter.c,v
retrieving revision 1.66
diff -u -r1.66 vm_meter.c
--- sys/vm/vm_meter.c	2002/10/02 20:31:47	1.66
+++ sys/vm/vm_meter.c	2002/12/08 14:59:01
@@ -222,7 +222,7 @@
 	return(error);
 }
 
-SYSCTL_PROC(_vm, VM_METER, vmmeter, CTLTYPE_OPAQUE|CTLFLAG_RD,
+SYSCTL_PROC(_vm, VM_TOTAL, vmtotal, CTLTYPE_OPAQUE|CTLFLAG_RD,
     0, sizeof(struct vmtotal), vmtotal, "S,vmtotal", 
     "System virtual memory statistics");
 SYSCTL_NODE(_vm, OID_AUTO, stats, CTLFLAG_RW, 0, "VM meter stats");
Index: sys/vm/vm_param.h
===================================================================
RCS file: /home/ncvs/src/sys/vm/vm_param.h,v
retrieving revision 1.15
diff -u -r1.15 vm_param.h
--- sys/vm/vm_param.h	2001/10/10 23:06:54	1.15
+++ sys/vm/vm_param.h	2002/12/08 14:59:02
@@ -76,7 +76,7 @@
 /*
  * CTL_VM identifiers
  */
-#define	VM_METER		1	/* struct vmmeter */
+#define	VM_TOTAL		1	/* struct vmtotal */
 #define	VM_LOADAVG	 	2	/* struct loadavg */
 #define VM_V_FREE_MIN		3	/* cnt.v_free_min */
 #define VM_V_FREE_TARGET	4	/* cnt.v_free_target */
@@ -91,7 +91,7 @@
 
 #define CTL_VM_NAMES { \
 	{ 0, 0 }, \
-	{ "vmmeter", CTLTYPE_STRUCT }, \
+	{ "vmtotal", CTLTYPE_STRUCT }, \
 	{ "loadavg", CTLTYPE_STRUCT }, \
 	{ "v_free_min", CTLTYPE_INT }, \
 	{ "v_free_target", CTLTYPE_INT }, \
Index: usr.bin/systat/vmstat.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/systat/vmstat.c,v
retrieving revision 1.52
diff -u -r1.52 vmstat.c
--- usr.bin/systat/vmstat.c	2002/06/06 23:01:50	1.52
+++ usr.bin/systat/vmstat.c	2002/12/08 14:59:05
@@ -784,7 +784,7 @@
 
 	size = sizeof(ls->Total);
 	mib[0] = CTL_VM;
-	mib[1] = VM_METER;
+	mib[1] = VM_TOTAL;
 	if (sysctl(mib, 2, &ls->Total, &size, NULL, 0) < 0) {
 		error("Can't get kernel info: %s\n", strerror(errno));
 		bzero(&ls->Total, sizeof(ls->Total));
Index: usr.bin/vmstat/vmstat.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/vmstat/vmstat.c,v
retrieving revision 1.59
diff -u -r1.59 vmstat.c
--- usr.bin/vmstat/vmstat.c	2002/08/09 15:47:43	1.59
+++ usr.bin/vmstat/vmstat.c	2002/12/08 14:59:07
@@ -472,7 +472,7 @@
 		kread(X_SUM, &sum, sizeof(sum));
 		size = sizeof(total);
 		mib[0] = CTL_VM;
-		mib[1] = VM_METER;
+		mib[1] = VM_TOTAL;
 		if (sysctl(mib, 2, &total, &size, NULL, 0) < 0) {
 			(void)printf("Can't get kerninfo: %s\n",
 				     strerror(errno));

--KsGdsel6WgEHnImy--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021208150211.GA68549>