bin/115513: [PATCH] Add step down/up options to powerd(8)
Oliver Fromme
olli at secnetix.de
Tue Aug 14 04:40:03 PDT 2007
>Number: 115513
>Category: bin
>Synopsis: [PATCH] Add step down/up options to powerd(8)
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Tue Aug 14 11:40:02 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator: Oliver Fromme
>Release: FreeBSD 6.2-STABLE-20070808 i386
>Organization:
secnetix GmbH & Co. KG
http://www.secnetix.de/bsd
>Environment:
System: FreeBSD pluto.secnetix.de 6.2-STABLE-20070808 FreeBSD 6.2-STABLE-20070808 #0: Wed Aug 8 14:35:59 CEST 2007 olli at pluto.secnetix.de:/usr/obj/usr/src/sys/PLUTO i386
>Description:
By default, powerd(1) adjusts the CPU freq level by one
step down upon every polling interval if the CPU idle
percent level is considered to be high, or two steps up
if the CPU idle percent level is considered to be low.
Those values (one step down, two steps up) are hardcoded
and cannot be changed by the user.
However, in some situations it is desirable to change
those numbers. In particular, if the system supports
many fine-grained levels, it can take a long time for
the CPU to get back to full performance. Making the
polling interval shorter isn't always a desirable
solution because of side effects.
The patch presented here adds two options -d and -u
which specify the number of freq steps (down and up,
respectively) when changing the performance level.
The default values are 1 and 2, i.e. the same as
previous behaviour without the patch.
A diff to the manpage is included, too.
>How-To-Repeat:
n/a
>Fix:
--- powerd.8.orig 2006-01-24 18:02:39.000000000 +0100
+++ powerd.8 2007-08-14 12:51:33.000000000 +0200
@@ -34,11 +34,13 @@
.Nm
.Op Fl a Ar mode
.Op Fl b Ar mode
+.Op Fl d Ar steps_down
.Op Fl i Ar percent
.Op Fl n Ar mode
.Op Fl p Ar ival
.Op Fl P Ar pidfile
.Op Fl r Ar percent
+.Op Fl u Ar steps_up
.Op Fl v
.Sh DESCRIPTION
The
@@ -70,6 +72,11 @@
Selects the
.Ar mode
to use while on battery power.
+.It Fl d Ar steps_down
+In adaptive mode, degrade the performance by
+.Ar steps_down
+levels every time the CPU idle percent level is considered to be high.
+The default is 1.
.It Fl i Ar percent
Specifies the CPU idle percent level when
adaptive
@@ -92,6 +99,11 @@
adaptive
mode should consider the CPU running and increase performance.
The default is 65% or lower.
+.It Fl u Ar steps_up
+In adaptive mode, increase the performance by
+.Ar steps_up
+levels every time the CPU idle percent level is considered to be low.
+The default is 2.
.It Fl v
Verbose mode.
Messages about power changes will be printed to stdout and
--- powerd.c.orig 2007-08-08 13:52:24.000000000 +0200
+++ powerd.c 2007-08-14 12:43:37.000000000 +0200
@@ -50,6 +50,8 @@
#define DEFAULT_ACTIVE_PERCENT 65
#define DEFAULT_IDLE_PERCENT 90
#define DEFAULT_POLL_INTERVAL 500 /* Poll interval in milliseconds */
+#define DEFAULT_STEPS_DOWN 1
+#define DEFAULT_STEPS_UP 2
enum modes_t {
MODE_MIN,
@@ -261,6 +263,7 @@
long idle, total;
int curfreq, *freqs, i, *mwatts, numfreqs;
int ch, mode_ac, mode_battery, mode_none, acline, mode, vflag;
+ int steps_down, steps_up;
uint64_t mjoules_used;
size_t len;
@@ -269,6 +272,8 @@
cpu_running_mark = DEFAULT_ACTIVE_PERCENT;
cpu_idle_mark = DEFAULT_IDLE_PERCENT;
poll_ival = DEFAULT_POLL_INTERVAL;
+ steps_down = DEFAULT_STEPS_DOWN;
+ steps_up = DEFAULT_STEPS_UP;
mjoules_used = 0;
vflag = 0;
apm_fd = -1;
@@ -277,7 +282,7 @@
if (geteuid() != 0)
errx(1, "must be root to run");
- while ((ch = getopt(argc, argv, "a:b:i:n:p:P:r:v")) != EOF)
+ while ((ch = getopt(argc, argv, "a:b:d:i:n:p:P:r:u:v")) != EOF)
switch (ch) {
case 'a':
parse_mode(optarg, &mode_ac, ch);
@@ -285,6 +290,14 @@
case 'b':
parse_mode(optarg, &mode_battery, ch);
break;
+ case 'd':
+ steps_down = atoi(optarg);
+ if (steps_down < 0) {
+ warnx("%d is not a valid step count",
+ steps_down);
+ usage();
+ }
+ break;
case 'i':
cpu_idle_mark = atoi(optarg);
if (cpu_idle_mark < 0 || cpu_idle_mark > 100) {
@@ -314,6 +327,14 @@
usage();
}
break;
+ case 'u':
+ steps_up = atoi(optarg);
+ if (steps_up < 0) {
+ warnx("%d is not a valid step count",
+ steps_up);
+ usage();
+ }
+ break;
case 'v':
vflag = 1;
break;
@@ -470,7 +491,7 @@
}
if (idle < (total * cpu_running_mark) / 100 &&
curfreq < freqs[0]) {
- i -= 2;
+ i -= steps_down;
if (i < 0)
i = 0;
if (vflag) {
@@ -483,7 +504,9 @@
freqs[i]);
} else if (idle > (total * cpu_idle_mark) / 100 &&
curfreq > freqs[numfreqs - 1]) {
- i++;
+ i += steps_up;
+ if (i > numfreqs - 1)
+ i = numfreqs - 1;
if (vflag) {
printf("idle time > %d%%, decreasing clock"
" speed from %d MHz to %d MHz\n",
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list