Date: Mon, 18 Apr 2005 14:27:53 +0200 From: "Poul-Henning Kamp" <phk@phk.freebsd.dk> Cc: Eric Anderson <anderson@centtech.com> Subject: Re: powerd(8) Message-ID: <2428.1113827273@critter.freebsd.dk> In-Reply-To: Your message of "Mon, 18 Apr 2005 14:19:14 %2B0200." <2304.1113826754@critter.freebsd.dk>
next in thread | previous in thread | raw e-mail | index | archive | help
In message <2304.1113826754@critter.freebsd.dk>, "Poul-Henning Kamp" writes: >In message <4263A33A.3030201@centtech.com>, Eric Anderson writes: >>Lukas Ertl wrote: >> >>There's been some discussion on the -mobile list (I believe) about >>this kind of thing before. I think powerd is currently running with >>a 'best shot' configuration, and I'm pretty sure that if anyone has >>a better algorithm in a patch form for people to try, I'm certain the >>good people with commit bits would easily commit a patched better version. > >I don't think a proportional approach will work in this case, the steps >are too far apart. > >I also think the switch to full speed is wrong. Such see-saw >algorithms waste far too much time decaying. A less steep flank >should be used. > >For instance: > > if (idle > 90%) > reduce clock one step. > if (idle < 80%) > increase clock two steps. Here's a patch which implements "phk" mode: Index: powerd.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/powerd/powerd.c,v retrieving revision 1.4 diff -u -r1.4 powerd.c --- powerd.c 27 Feb 2005 01:58:49 -0000 1.4 +++ powerd.c 18 Apr 2005 12:26:03 -0000 @@ -50,6 +50,7 @@ enum modes_t { MODE_MIN, MODE_ADAPTIVE, + MODE_PHK, MODE_MAX, }; @@ -220,6 +221,8 @@ *mode = MODE_MAX; else if (strcmp(arg, "adaptive") == 0) *mode = MODE_ADAPTIVE; + else if (strcmp(arg, "phk") == 0) + *mode = MODE_PHK; else errx(1, "bad option: -%c %s", (char)ch, optarg); } @@ -377,6 +380,37 @@ if (read_usage_times(&idle, &total)) err(1, "read_usage_times"); + if (mode == MODE_PHK) { + for (i = 0; i < numfreqs - 1; i++) { + if (freqs[i] == curfreq) + break; + } + if (idle < (total * cpu_running_mark) / 100 && + curfreq < freqs[0]) { + i -= 2; + if (i < 0) + i = 0; + if (vflag) { + printf("idle time < %d%%, increasing clock" + " speed from %d MHz to %d MHz\n", + cpu_running_mark, curfreq, freqs[i]); + } + if (set_freq(freqs[i])) + err(1, "error setting CPU frequency %d", freqs[i]); + } else if (idle > (total * cpu_idle_mark) / 100 && + curfreq > freqs[numfreqs - 1]) { + i++; + if (vflag) { + printf("idle time > %d%%, decreasing clock" + " speed from %d MHz to %d MHz\n", + cpu_idle_mark, curfreq, freqs[i]); + } + if (set_freq(freqs[i])) + err(1, "error setting CPU frequency %d", freqs[i]); + } + continue; + } + /* * If we're idle less than the active mark, jump the CPU to * its fastest speed if we're not there yet. If we're idle -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk@FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?2428.1113827273>