cpuidle-set.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <errno.h>
  4. #include <stdlib.h>
  5. #include <limits.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include <getopt.h>
  9. #include "cpufreq.h"
  10. #include "helpers/helpers.h"
  11. #include "helpers/sysfs.h"
  12. static struct option info_opts[] = {
  13. { .name = "disable",
  14. .has_arg = required_argument, .flag = NULL, .val = 'd'},
  15. { .name = "enable",
  16. .has_arg = required_argument, .flag = NULL, .val = 'e'},
  17. { .name = "disable-by-latency",
  18. .has_arg = required_argument, .flag = NULL, .val = 'D'},
  19. { .name = "enable-all",
  20. .has_arg = no_argument, .flag = NULL, .val = 'E'},
  21. { },
  22. };
  23. int cmd_idle_set(int argc, char **argv)
  24. {
  25. extern char *optarg;
  26. extern int optind, opterr, optopt;
  27. int ret = 0, cont = 1, param = 0, disabled;
  28. unsigned long long latency = 0, state_latency;
  29. unsigned int cpu = 0, idlestate = 0, idlestates = 0;
  30. char *endptr;
  31. do {
  32. ret = getopt_long(argc, argv, "d:e:ED:", info_opts, NULL);
  33. if (ret == -1)
  34. break;
  35. switch (ret) {
  36. case '?':
  37. param = '?';
  38. cont = 0;
  39. break;
  40. case 'd':
  41. if (param) {
  42. param = -1;
  43. cont = 0;
  44. break;
  45. }
  46. param = ret;
  47. idlestate = atoi(optarg);
  48. break;
  49. case 'e':
  50. if (param) {
  51. param = -1;
  52. cont = 0;
  53. break;
  54. }
  55. param = ret;
  56. idlestate = atoi(optarg);
  57. break;
  58. case 'D':
  59. if (param) {
  60. param = -1;
  61. cont = 0;
  62. break;
  63. }
  64. param = ret;
  65. latency = strtoull(optarg, &endptr, 10);
  66. if (*endptr != '\0') {
  67. printf(_("Bad latency value: %s\n"), optarg);
  68. exit(EXIT_FAILURE);
  69. }
  70. break;
  71. case 'E':
  72. if (param) {
  73. param = -1;
  74. cont = 0;
  75. break;
  76. }
  77. param = ret;
  78. break;
  79. case -1:
  80. cont = 0;
  81. break;
  82. }
  83. } while (cont);
  84. switch (param) {
  85. case -1:
  86. printf(_("You can't specify more than one "
  87. "output-specific argument\n"));
  88. exit(EXIT_FAILURE);
  89. case '?':
  90. printf(_("invalid or unknown argument\n"));
  91. exit(EXIT_FAILURE);
  92. }
  93. /* Default is: set all CPUs */
  94. if (bitmask_isallclear(cpus_chosen))
  95. bitmask_setall(cpus_chosen);
  96. for (cpu = bitmask_first(cpus_chosen);
  97. cpu <= bitmask_last(cpus_chosen); cpu++) {
  98. if (!bitmask_isbitset(cpus_chosen, cpu))
  99. continue;
  100. if (sysfs_is_cpu_online(cpu) != 1)
  101. continue;
  102. idlestates = sysfs_get_idlestate_count(cpu);
  103. if (idlestates <= 0)
  104. continue;
  105. switch (param) {
  106. case 'd':
  107. ret = sysfs_idlestate_disable(cpu, idlestate, 1);
  108. if (ret == 0)
  109. printf(_("Idlestate %u disabled on CPU %u\n"), idlestate, cpu);
  110. else if (ret == -1)
  111. printf(_("Idlestate %u not available on CPU %u\n"),
  112. idlestate, cpu);
  113. else if (ret == -2)
  114. printf(_("Idlestate disabling not supported by kernel\n"));
  115. else
  116. printf(_("Idlestate %u not disabled on CPU %u\n"),
  117. idlestate, cpu);
  118. break;
  119. case 'e':
  120. ret = sysfs_idlestate_disable(cpu, idlestate, 0);
  121. if (ret == 0)
  122. printf(_("Idlestate %u enabled on CPU %u\n"), idlestate, cpu);
  123. else if (ret == -1)
  124. printf(_("Idlestate %u not available on CPU %u\n"),
  125. idlestate, cpu);
  126. else if (ret == -2)
  127. printf(_("Idlestate enabling not supported by kernel\n"));
  128. else
  129. printf(_("Idlestate %u not enabled on CPU %u\n"),
  130. idlestate, cpu);
  131. break;
  132. case 'D':
  133. for (idlestate = 0; idlestate < idlestates; idlestate++) {
  134. disabled = sysfs_is_idlestate_disabled
  135. (cpu, idlestate);
  136. state_latency = sysfs_get_idlestate_latency
  137. (cpu, idlestate);
  138. printf("CPU: %u - idlestate %u - state_latency: %llu - latency: %llu\n",
  139. cpu, idlestate, state_latency, latency);
  140. if (disabled == 1 || latency > state_latency)
  141. continue;
  142. ret = sysfs_idlestate_disable
  143. (cpu, idlestate, 1);
  144. if (ret == 0)
  145. printf(_("Idlestate %u disabled on CPU %u\n"), idlestate, cpu);
  146. }
  147. break;
  148. case 'E':
  149. for (idlestate = 0; idlestate < idlestates; idlestate++) {
  150. disabled = sysfs_is_idlestate_disabled
  151. (cpu, idlestate);
  152. if (disabled == 1) {
  153. ret = sysfs_idlestate_disable
  154. (cpu, idlestate, 0);
  155. if (ret == 0)
  156. printf(_("Idlestate %u enabled on CPU %u\n"), idlestate, cpu);
  157. }
  158. }
  159. break;
  160. default:
  161. /* Not reachable with proper args checking */
  162. printf(_("Invalid or unknown argument\n"));
  163. exit(EXIT_FAILURE);
  164. break;
  165. }
  166. }
  167. return EXIT_SUCCESS;
  168. }