On Sat, 11 Mar 2000, Kris Kennaway wrote:

> On Sun, 12 Mar 2000, Oliver Fromme wrote:
> 
> > Then look up the definition of kread() in the same file, and
> > how the contents of cur.cp_time are used in the cpustats()
> > function.  Note that "cur" is a "struct statinfo", which is
> > defined in /usr/include/devstat.h.  The CPU states are defined
> > in /usr/include/sys/dkstat.h.
> 
> We probably should make this into a sysctl to divorce the binaries from
> having to read kvm.

I'm definitely for it... If I can get permission from Jordan, perhaps the
attached patches can make it into upcoming release.

Andrzej Bialecki

//  <[EMAIL PROTECTED]> WebGiro AB, Sweden (http://www.webgiro.com)
// -------------------------------------------------------------------
// ------ FreeBSD: The Power to Serve. http://www.freebsd.org --------
// --- Small & Embedded FreeBSD: http://www.freebsd.org/~picobsd/ ----
Index: sysctl.c
===================================================================
RCS file: /home/ncvs/src/sbin/sysctl/sysctl.c,v
retrieving revision 1.25
diff -u -r1.25 sysctl.c
--- sysctl.c    1999/11/22 08:43:00     1.25
+++ sysctl.c    2000/03/12 15:35:12
@@ -46,6 +46,7 @@
 #endif /* not lint */
 
 #include <sys/types.h>
+#include <sys/dkstat.h>
 #include <sys/stat.h>
 #include <sys/sysctl.h>
 #include <sys/resource.h>
@@ -219,6 +220,29 @@
 /* These functions will dump out various interesting structures. */
 
 static int
+S_cpu_time(int l2, void *p)
+{
+       long *cpt=(long *)p;
+       double d,total;
+       int i;
+
+       total=0;
+       for(i=0;i<CPUSTATES;i++)
+               total+=*(cpt+i);
+       d=100**(cpt+CP_USER)/total;
+       printf("{ user=%.0f%% ",d);
+       d=100**(cpt+CP_NICE)/total;
+       printf("nice=%.0f%% ",d);
+       d=100**(cpt+CP_SYS)/total;
+       printf("sys=%.0f%% ",d);
+       d=100**(cpt+CP_INTR)/total;
+       printf("intr=%.0f%% ",d);
+       d=100**(cpt+CP_IDLE)/total;
+       printf("idle=%.0f%% }",d);
+       return(0);
+}
+
+static int
 S_clockinfo(int l2, void *p)
 {
        struct clockinfo *ci = (struct clockinfo*)p;
@@ -417,6 +441,7 @@
        case 'S':
                i = 0;
                if (!strcmp(fmt, "S,clockinfo"))        func = S_clockinfo;
+               else if (!strcmp(fmt, "S,cpu_time"))    func = S_cpu_time;
                else if (!strcmp(fmt, "S,timeval"))     func = S_timeval;
                else if (!strcmp(fmt, "S,loadavg"))     func = S_loadavg;
                else if (!strcmp(fmt, "T,dev_t"))       func = T_dev_t;
Index: kern_clock.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_clock.c,v
retrieving revision 1.105
diff -u -r1.105 kern_clock.c
--- kern_clock.c        2000/02/13 10:56:32     1.105
+++ kern_clock.c        2000/03/12 15:35:44
@@ -105,6 +105,9 @@
 SYSCTL_STRUCT(_kern, KERN_BOOTTIME, boottime, CTLFLAG_RD,
     &boottime, timeval, "System boottime");
 
+SYSCTL_OPAQUE(_kern, OID_AUTO, cpu_time, CTLFLAG_RD, &cp_time,
+       sizeof(cp_time), "S,cpu_time", "CPU times");
+
 /*
  * Which update policy to use.
  *   0 - every tick, bad hardware may fail with "calcru negative..."

Reply via email to