powerd: add tunables to control the load thresold
authorJoris Giovannangeli <joris@giovannangeli.fr>
Tue, 28 Oct 2014 22:43:48 +0000 (23:43 +0100)
committerJoris Giovannangeli <joris@giovannangeli.fr>
Tue, 28 Oct 2014 22:43:48 +0000 (23:43 +0100)
usr.sbin/powerd/powerd.8
usr.sbin/powerd/powerd.c

index 8e66e46..428311c 100644 (file)
@@ -35,6 +35,11 @@ Turbo mode.
 Disables switching to turbo mode as maximum frequency completely.
 Switching to turbo mode as maximum frequency is enabled by default,
 if the CPU supports it.
+.It Fl u
+Per cpu load limit in percent to force max frequency.
+.It Fl p
+Percent of the upper limit to substract as an hysteresis value to scale
+down to the min frequency.
 .El
 .Sh DIAGNOSTICS
 The
index cbfef08..4508ad9 100644 (file)
@@ -63,7 +63,9 @@ int DomEnd;
 int NCpus;
 int CpuCount[256];     /* # of cpus in any given domain */
 int CpuToDom[256];     /* domain a particular cpu belongs to */
-double Trigger = 0.25; /* load per cpu to force max freq */
+int Hysteresis = 10;
+double TriggerUp = 0.25;/* load per cpu to force max freq */
+double TriggerDown; /* load per cpu to force the min freq */
 
 static void sigintr(int signo);
 
@@ -76,7 +78,7 @@ main(int ac, char **av)
        int nstate;
        char buf[64];
 
-       while ((ch = getopt(ac, av, "dt")) != -1) {
+       while ((ch = getopt(ac, av, "dtp:u:")) != -1) {
                switch(ch) {
                case 'd':
                        DebugOpt = 1;
@@ -84,6 +86,12 @@ main(int ac, char **av)
                case 't':
                        TurboOpt = 0;
                        break;
+               case 'p':
+                       Hysteresis = (int)strtol(optarg, NULL, 10);
+                       break;
+               case 'u':
+                       TriggerUp = (double) strtol(optarg, NULL, 10) / 100;
+                       break;
                default:
                        usage();
                        /* NOT REACHED */
@@ -92,6 +100,18 @@ main(int ac, char **av)
        ac -= optind;
        av += optind;
 
+       if (0 > Hysteresis || Hysteresis > 99) {
+               fprintf(stderr, "Invalid hysteresis value\n");
+               exit(1);
+       }
+
+       if (0 > TriggerUp || TriggerUp > 1) {
+               fprintf(stderr, "Invalid load limit value\n");
+               exit(1);
+       }
+
+       TriggerDown = TriggerUp - (TriggerUp * (double) Hysteresis / 100);
+
        /*
         * Make sure powerd is not already running.
         */
@@ -166,7 +186,9 @@ main(int ac, char **av)
                qavg = getcputime();
                savg = (savg * 7.0 + qavg) / 8.0;
 
-               nstate = savg / Trigger;
+               nstate = savg / TriggerUp;
+               if (nstate < CpuLimit)
+                       nstate = savg / TriggerDown;
                if (nstate > NCpus)
                        nstate = NCpus;
                if (DebugOpt) {