On Wed, Sep 23 2020, "Ted Unangst" <[email protected]> wrote:
> On 2020-09-23, Jeremie Courreges-Anglas wrote:
>
>> ok?
>
> Seems fine.
>
>
>> Note: I inlined the apmd(8)->apm(8) perfpolicy conversion for now, which
>> brings a question. I find it weird that there is a special "high"
>> perfpolicy (effectively similar to perfpolicy=manual + setperf=100) but
>> no "low" perfpolicy. Is "high" useful to anyone?
>
> If you're benchmarking or something, it's convenient to toggle between
> high and auto. There's less use for low, since that's what auto defaults to.
Well you can do auto->high easily with apm(8) -H or sysctl
hw.perfpolicy=manual hw.setperf=100. I'm not sure a special "high"
hw.perfpolicy choice brings much value and I would appreciate a simple
"manual" vs "auto" situation.
This has an impact on documentation. sysctl(2) doesn't mention that
setting hw.perfpolicy=high also locks hw.setperf=100. The apm(8)
manpage only talks about -H setting hw.setperf=100. The description for
apmd(8) -H says
Start apmd in *manual* performance adjustment mode,
initialising hw.setperf to 100.
which is not the whole story. If you use apm/apmd -H you can't later
just run sysctl hw.setperf=50:
sysctl: hw.setperf: Operation not permitted
Initially I had a diff to teach apm(8) about hw.perfpolicy="high" but
I'm not sure it's the right direction any more. Diff below fwiw, not
looking for oks.
Index: apm/apm.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/apm/apm.c,v
retrieving revision 1.37
diff -u -p -r1.37 apm.c
--- apm/apm.c 23 Sep 2020 05:50:26 -0000 1.37
+++ apm/apm.c 24 Sep 2020 20:29:49 -0000
@@ -399,7 +399,8 @@ balony:
if (doperf)
printf("Performance adjustment mode: %s (%d MHz)\n",
- perf_mode(reply.perfmode), reply.cpuspeed);
+ perfmode_to_perfpolicy(reply.perfmode),
+ reply.cpuspeed);
break;
default:
break;
Index: apmd/apm-proto.h
===================================================================
RCS file: /d/cvs/src/usr.sbin/apmd/apm-proto.h,v
retrieving revision 1.10
diff -u -p -r1.10 apm-proto.h
--- apmd/apm-proto.h 23 Sep 2020 05:50:26 -0000 1.10
+++ apmd/apm-proto.h 24 Sep 2020 20:29:49 -0000
@@ -51,6 +51,7 @@ enum apm_perfmode {
PERF_NONE = -1,
PERF_MANUAL,
PERF_AUTO,
+ PERF_HIGH,
};
struct apm_command {
@@ -66,8 +67,9 @@ struct apm_reply {
struct apm_power_info batterystate;
};
-#define APMD_VNO 3
+#define APMD_VNO 4
extern const char *battstate(int state);
extern const char *ac_state(int state);
-extern const char *perf_mode(int mode);
+extern const char *perfmode_to_perfpolicy(int mode);
+extern enum apm_perfmode perfpolicy_to_perfmode(const char *);
Index: apmd/apmd.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/apmd/apmd.c,v
retrieving revision 1.98
diff -u -p -r1.98 apmd.c
--- apmd/apmd.c 24 Sep 2020 07:23:41 -0000 1.98
+++ apmd/apmd.c 24 Sep 2020 20:29:49 -0000
@@ -310,16 +310,11 @@ handle_client(int sock_fd, int ctl_fd)
break;
}
- reply.perfmode = PERF_NONE;
- if (sysctl(perfpol_mib, 2, perfpol, &perfpol_sz, NULL, 0) == -1)
+ if (sysctl(perfpol_mib, 2, perfpol, &perfpol_sz, NULL, 0) == -1) {
logmsg(LOG_INFO, "cannot read hw.perfpolicy");
- else {
- if (strcmp(perfpol, "manual") == 0 ||
- strcmp(perfpol, "high") == 0) {
- reply.perfmode = PERF_MANUAL;
- } else if (strcmp(perfpol, "auto") == 0)
- reply.perfmode = PERF_AUTO;
- }
+ reply.perfmode = PERF_NONE;
+ } else
+ reply.perfmode = perfpolicy_to_perfmode(perfpol);
if (sysctl(cpuspeed_mib, 2, &cpuspeed, &cpuspeed_sz, NULL, 0) == -1) {
logmsg(LOG_INFO, "cannot read hw.cpuspeed");
Index: apmd/apmsubr.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/apmd/apmsubr.c,v
retrieving revision 1.9
diff -u -p -r1.9 apmsubr.c
--- apmd/apmsubr.c 23 Sep 2020 05:50:26 -0000 1.9
+++ apmd/apmsubr.c 24 Sep 2020 20:29:49 -0000
@@ -31,6 +31,8 @@
#include <sys/types.h>
#include <machine/apmvar.h>
+#include <string.h>
+
#include "apm-proto.h"
const char *
@@ -72,14 +74,29 @@ ac_state(int state)
}
const char *
-perf_mode(int mode)
+perfmode_to_perfpolicy(int mode)
{
switch (mode) {
- case PERF_MANUAL:
- return "manual";
case PERF_AUTO:
return "auto";
+ case PERF_HIGH:
+ return "high";
+ case PERF_MANUAL:
+ return "manual";
default:
return "invalid";
}
+}
+
+enum apm_perfmode
+perfpolicy_to_perfmode(const char *perfpolicy)
+{
+ if (strcmp(perfpolicy, "auto") == 0)
+ return PERF_AUTO;
+ else if (strcmp(perfpolicy, "high") == 0)
+ return PERF_HIGH;
+ else if (strcmp(perfpolicy, "manual") == 0)
+ return PERF_MANUAL;
+
+ return PERF_NONE;
}
--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE