]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
cpupower: Introduce idle state disable-by-latency and enable-all
authorThomas Renninger <trenn@suse.de>
Tue, 13 May 2014 10:41:41 +0000 (12:41 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 16 May 2014 22:36:36 +0000 (00:36 +0200)
Signed-off-by: Thomas Renninger <trenn@suse.de>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
tools/power/cpupower/man/cpupower-idle-set.1
tools/power/cpupower/utils/cpuidle-set.c

index 6b1607272a5bce559d750e3d527d2c27bd0b30a6..3e6799d7a79f1d951f1d6e95f65f337663c8f286 100644 (file)
@@ -13,11 +13,17 @@ sleep states. This can be handy for power vs performance tuning.
 .SH "OPTIONS"
 .LP
 .TP
-\fB\-d\fR \fB\-\-disable\fR
+\fB\-d\fR \fB\-\-disable\fR <STATE_NO>
 Disable a specific processor sleep state.
 .TP
-\fB\-e\fR \fB\-\-enable\fR
+\fB\-e\fR \fB\-\-enable\fR <STATE_NO>
 Enable a specific processor sleep state.
+.TP
+\fB\-D\fR \fB\-\-disable-by-latency\fR <LATENCY>
+Disable all idle states with a equal or higher latency than <LATENCY>
+.TP
+\fB\-E\fR \fB\-\-enable-all\fR
+Enable all idle states if not enabled already.
 
 .SH "REMARKS"
 .LP
index c78141c5dfac5308df9ef0144faafa0ef5d8b40d..d45d8d775c021482ab7a4d113351c7f6abd9a9ac 100644 (file)
 #include "helpers/sysfs.h"
 
 static struct option info_opts[] = {
-       { .name = "disable",    .has_arg = required_argument,   .flag = NULL,   .val = 'd'},
-       { .name = "enable",     .has_arg = required_argument,   .flag = NULL,   .val = 'e'},
+       { .name = "disable",
+         .has_arg = required_argument, .flag = NULL,   .val = 'd'},
+       { .name = "enable",
+         .has_arg = required_argument, .flag = NULL,   .val = 'e'},
+       { .name = "disable-by-latency",
+         .has_arg = required_argument, .flag = NULL,   .val = 'D'},
+       { .name = "enable-all",
+         .has_arg = no_argument,       .flag = NULL,   .val = 'E'},
        { },
 };
 
@@ -23,11 +29,13 @@ int cmd_idle_set(int argc, char **argv)
 {
        extern char *optarg;
        extern int optind, opterr, optopt;
-       int ret = 0, cont = 1, param = 0, idlestate = 0;
-       unsigned int cpu = 0;
+       int ret = 0, cont = 1, param = 0, disabled;
+       unsigned long long latency = 0, state_latency;
+       unsigned int cpu = 0, idlestate = 0, idlestates = 0;
+       char *endptr;
 
        do {
-               ret = getopt_long(argc, argv, "d:e:", info_opts, NULL);
+               ret = getopt_long(argc, argv, "d:e:ED:", info_opts, NULL);
                if (ret == -1)
                        break;
                switch (ret) {
@@ -53,6 +61,27 @@ int cmd_idle_set(int argc, char **argv)
                        param = ret;
                        idlestate = atoi(optarg);
                        break;
+               case 'D':
+                       if (param) {
+                               param = -1;
+                               cont = 0;
+                               break;
+                       }
+                       param = ret;
+                       latency = strtoull(optarg, &endptr, 10);
+                       if (*endptr != '\0') {
+                               printf(_("Bad latency value: %s\n"), optarg);
+                               exit(EXIT_FAILURE);
+                       }
+                       break;
+               case 'E':
+                       if (param) {
+                               param = -1;
+                               cont = 0;
+                               break;
+                       }
+                       param = ret;
+                       break;
                case -1:
                        cont = 0;
                        break;
@@ -79,8 +108,14 @@ int cmd_idle_set(int argc, char **argv)
                if (!bitmask_isbitset(cpus_chosen, cpu))
                        continue;
 
-               switch (param) {
+               if (sysfs_is_cpu_online(cpu) != 1)
+                       continue;
+
+               idlestates = sysfs_get_idlestate_count(cpu);
+               if (idlestates <= 0)
+                       continue;
 
+               switch (param) {
                case 'd':
                        ret = sysfs_idlestate_disable(cpu, idlestate, 1);
                        if (ret == 0)
@@ -107,6 +142,34 @@ int cmd_idle_set(int argc, char **argv)
                printf(_("Idlestate %u not enabled on CPU %u\n"),
                       idlestate, cpu);
                        break;
+               case 'D':
+                       for (idlestate = 0; idlestate < idlestates; idlestate++) {
+                               disabled = sysfs_is_idlestate_disabled
+                                       (cpu, idlestate);
+                               state_latency = sysfs_get_idlestate_latency
+                                       (cpu, idlestate);
+                               printf("CPU: %u - idlestate %u - state_latency: %llu - latency: %llu\n",
+                                      cpu, idlestate, state_latency, latency);
+                               if (disabled == 1 || latency > state_latency)
+                                       continue;
+                               ret = sysfs_idlestate_disable
+                                       (cpu, idlestate, 1);
+                               if (ret == 0)
+               printf(_("Idlestate %u disabled on CPU %u\n"), idlestate, cpu);
+                       }
+                       break;
+               case 'E':
+                       for (idlestate = 0; idlestate < idlestates; idlestate++) {
+                               disabled = sysfs_is_idlestate_disabled
+                                       (cpu, idlestate);
+                               if (disabled == 1) {
+                                       ret = sysfs_idlestate_disable
+                                               (cpu, idlestate, 0);
+                                       if (ret == 0)
+               printf(_("Idlestate %u enabled on CPU %u\n"), idlestate, cpu);
+                               }
+                       }
+                       break;
                default:
                        /* Not reachable with proper args checking */
                        printf(_("Invalid or unknown argument\n"));