A mobile user's wishlist

Johannes Hofmann Johannes.Hofmann at gmx.de
Fri Jun 16 11:23:45 PDT 2006


YONETANI Tomokazu <qhwt+dfly at xxxxxxxxxx> wrote:
> On Wed, Jun 07, 2006 at 11:10:59AM +0900, YONETANI Tomokazu wrote:
>> > FreeBSD has tools for that: sysutils/est and sysutils/estrcl
>> 
>> FreeBSD has a daemon named powerd and it's based on estctrl.
>> I'll try porting it to DragonFly.
> 
> Obviously I spoke too soon for this part; powerd is too hard to port
> without cpufreq framework.  I'm going to commit est driver alone for now
> and work on a DragonFly patch for estd(if Johannes Hofmann hasn't started
> it yet).

Ok, here is an initial patch against estd-r4.1 that makes things 
work on DragonFly. The question is how to integrate the modifications.
We could add #ifdef's or add the patch to the pkgsrc stuff...
Also I would suggest to adjust our est-sysctl names to match the
NetBSD ones's.
And what about that useconds_t? I just changed it to int. Any better
ideas?

  Johannes



diff -r 94c0f08cbd8c Makefile
--- a/Makefile	Fri Jun 16 19:33:44 2006 +0200
+++ b/Makefile	Fri Jun 16 20:16:38 2006 +0200
@@ -6,7 +6,7 @@ clean:
 	rm -f *~
 
 estd:	estd.c
-	gcc -O2 -lutil -o estd estd.c
+	gcc -O2 -lutil -lkinfo -o estd estd.c
 	
 all: estd
 
diff -r 94c0f08cbd8c estd.c
--- a/estd.c	Fri Jun 16 19:33:44 2006 +0200
+++ b/estd.c	Fri Jun 16 20:16:38 2006 +0200
@@ -26,13 +26,13 @@
 
 
 #include <stdlib.h>
+#include <stdio.h>
 #include <unistd.h>
 #include <time.h>
 #include <sys/param.h>
 #include <sys/sysctl.h>
-#include <sys/sched.h>
+#include <kinfo.h>
 #include <errno.h>
-#include <util.h>
 #include <signal.h>
 
 #define ESTD_VERSION "Release 4.1"
@@ -59,7 +59,7 @@ int             daemonize = 0;
 int             daemonize = 0;
 int             verbose = 0;
 int             strategy = SMOOTH;
-useconds_t      poll = DEF_POLL;
+int             poll = DEF_POLL;
 int             high = DEF_HIGH;
 int             low = DEF_LOW;
 int             minmhz = -1;
@@ -67,26 +67,23 @@ int             listfreq = 0;
 int             listfreq = 0;
 int		tech = TECH_UNKNOWN;
 
-static int      cpumib[2] = {CTL_KERN, KERN_CP_TIME};
 
 static char	*techdesc[3] = {"Unknown",
 				"Enhanced SpeedStep",
 				"PowerNow"
 				};
 static char	*freqctl[3] = {	"",	
-				"machdep.est.frequency.available",
+				"hw.est_freqs",
 				"machdep.powernow.frequency.available"
 				};
 static char	*setctl[3] = {	"",
-				"machdep.est.frequency.target",
+				"hw.est_curfreq",
 				"machdep.powernow.frequency.target"
 				};
 
-static u_int64_t cp_time[CPUSTATES];
-static u_int64_t cp_old[CPUSTATES];
-static u_int64_t cp_diff[CPUSTATES];
-static size_t   cp_time_size = sizeof(cp_time[0]) * CPUSTATES;
-
+static struct kinfo_cputime cp_time;
+static struct kinfo_cputime cp_old;
+static struct kinfo_cputime cp_diff;
 
 void
 usage()
@@ -113,16 +110,25 @@ get_cpuusage()
 {
 	int             i;
 	u_int64_t       total_time = 0;
-	memcpy(&cp_old[0], &cp_time[0], cp_time_size);
-	if (sysctl(cpumib, 2, &cp_time, &cp_time_size, NULL, 0) < 0) {
+
+	cp_old = cp_time;
+	if (kinfo_get_sched_cputime(&cp_time)) {
 		fprintf(stderr, "estd: Cannot get CPU status\n");
 		exit(1);
 	}
-	for (i = 0; i < CPUSTATES; i++) {
-		cp_diff[i] = cp_time[i] - cp_old[i];
-		total_time += cp_diff[i];
-	}
-	return (100 - (cp_diff[CP_IDLE] * 100) / total_time);
+
+	cp_diff.cp_user = cp_time.cp_user - cp_old.cp_user;
+	total_time += cp_diff.cp_user;
+	cp_diff.cp_nice = cp_time.cp_nice - cp_old.cp_nice;
+	total_time += cp_diff.cp_nice;
+	cp_diff.cp_sys = cp_time.cp_sys - cp_old.cp_sys;
+	total_time += cp_diff.cp_sys;
+	cp_diff.cp_intr = cp_time.cp_intr - cp_old.cp_intr;
+	total_time += cp_diff.cp_intr;
+	cp_diff.cp_idle = cp_time.cp_idle - cp_old.cp_idle;
+	total_time += cp_diff.cp_idle;
+
+	return (100 - (cp_diff.cp_idle * 100) / total_time);
 }
 
 /* sets the cpu frequency */
@@ -313,11 +319,6 @@ main(int argc, char *argv[])
 	signal(SIGTERM, &sighandler);
 	curfreq = minidx;
 	set_freq(freqtab[curfreq]);
-	for (i = 0; i < CPUSTATES; i++) {
-		cp_time[i] = 0;
-		cp_old[i] = 0;
-		cp_diff[i] = 0;
-	}
 
 	/* the big processing loop, we will only exit via signal */
 	while (1) {






More information about the Users mailing list