static void handle_options(int *argc, const char ***argv) { int ret, x, new_argc = 0; if (*argc < 1) return; for (x = 0; x < *argc && ((*argv)[x])[0] == '-'; x++) { const char *param = (*argv)[x]; if (!strcmp(param, "-h") || !strcmp(param, "--help")) { print_help(); exit(EXIT_SUCCESS); } else if (!strcmp(param, "-c") || !strcmp(param, "--cpu")) { if (*argc < 2) { print_help(); exit(EXIT_FAILURE); } if (!strcmp((*argv)[x+1], "all")) bitmask_setall(cpus_chosen); else { ret = bitmask_parselist( (*argv)[x+1], cpus_chosen); if (ret < 0) { fprintf(stderr, _("Error parsing cpu " "list\n")); exit(EXIT_FAILURE); } } x += 1; new_argc += 2; continue; } else if (!strcmp(param, "-v") || !strcmp(param, "--version")) { print_version(); exit(EXIT_SUCCESS); #ifdef DEBUG } else if (!strcmp(param, "-d") || !strcmp(param, "--debug")) { be_verbose = 1; new_argc++; continue; #endif } else { fprintf(stderr, "Unknown option: %s\n", param); print_help(); exit(EXIT_FAILURE); } } *argc -= new_argc; *argv += new_argc; }
int cmd_freq_set(int argc, char **argv) { extern char *optarg; extern int optind, opterr, optopt; int ret = 0, cont = 1; int double_parm = 0, related = 0, policychange = 0; unsigned long freq = 0; char gov[20]; unsigned int cpu; struct cpufreq_policy new_pol = { .min = 0, .max = 0, .governor = NULL, }; /* parameter parsing */ do { ret = getopt_long(argc, argv, "d:u:g:f:hr", set_opts, NULL); switch (ret) { case '?': print_unknown_arg(); return -EINVAL; case 'h': freq_set_help(); return 0; case -1: cont = 0; break; case 'r': if (related) double_parm++; related++; break; case 'd': if (new_pol.min) double_parm++; policychange++; new_pol.min = string_to_frequency(optarg); if (new_pol.min == 0) { print_unknown_arg(); return -EINVAL; } break; case 'u': if (new_pol.max) double_parm++; policychange++; new_pol.max = string_to_frequency(optarg); if (new_pol.max == 0) { print_unknown_arg(); return -EINVAL; } break; case 'f': if (freq) double_parm++; freq = string_to_frequency(optarg); if (freq == 0) { print_unknown_arg(); return -EINVAL; } break; case 'g': if (new_pol.governor) double_parm++; policychange++; if ((strlen(optarg) < 3) || (strlen(optarg) > 18)) { print_unknown_arg(); return -EINVAL; } if ((sscanf(optarg, "%s", gov)) != 1) { print_unknown_arg(); return -EINVAL; } new_pol.governor = gov; break; } } while (cont); /* parameter checking */ if (double_parm) { printf("the same parameter was passed more than once\n"); return -EINVAL; } if (freq && policychange) { printf(_("the -f/--freq parameter cannot be combined with -d/--min, -u/--max or\n" "-g/--governor parameters\n")); return -EINVAL; } if (!freq && !policychange) { printf(_("At least one parameter out of -f/--freq, -d/--min, -u/--max, and\n" "-g/--governor must be passed\n")); return -EINVAL; } /* Default is: set all CPUs */ if (bitmask_isallclear(cpus_chosen)) bitmask_setall(cpus_chosen); /* Also set frequency settings for related CPUs if -r is passed */ if (related) { for (cpu = bitmask_first(cpus_chosen); cpu <= bitmask_last(cpus_chosen); cpu++) { struct cpufreq_affected_cpus *cpus; if (!bitmask_isbitset(cpus_chosen, cpu) || cpufreq_cpu_exists(cpu)) continue; cpus = cpufreq_get_related_cpus(cpu); if (!cpus) break; while (cpus->next) { bitmask_setbit(cpus_chosen, cpus->cpu); cpus = cpus->next; } cpufreq_put_related_cpus(cpus); } } /* loop over CPUs */ for (cpu = bitmask_first(cpus_chosen); cpu <= bitmask_last(cpus_chosen); cpu++) { if (!bitmask_isbitset(cpus_chosen, cpu) || cpufreq_cpu_exists(cpu)) continue; printf(_("Setting cpu: %d\n"), cpu); ret = do_one_cpu(cpu, &new_pol, freq, policychange); if (ret) break; } if (ret) print_error(); return ret; }
int cmd_set(int argc, char **argv) { extern char *optarg; extern int optind, opterr, optopt; unsigned int cpu; union { struct { int perf_bias:1; }; int params; } params; int perf_bias = 0; int ret = 0; setlocale(LC_ALL, ""); textdomain(PACKAGE); params.params = 0; /* parameter parsing */ while ((ret = getopt_long(argc, argv, "b:", set_opts, NULL)) != -1) { switch (ret) { case 'b': if (params.perf_bias) print_wrong_arg_exit(); perf_bias = atoi(optarg); if (perf_bias < 0 || perf_bias > 15) { printf(_("--perf-bias param out " "of range [0-%d]\n"), 15); print_wrong_arg_exit(); } params.perf_bias = 1; break; default: print_wrong_arg_exit(); } }; if (!params.params) print_wrong_arg_exit(); /* Default is: set all CPUs */ if (bitmask_isallclear(cpus_chosen)) bitmask_setall(cpus_chosen); /* loop over CPUs */ for (cpu = bitmask_first(cpus_chosen); cpu <= bitmask_last(cpus_chosen); cpu++) { if (!bitmask_isbitset(cpus_chosen, cpu) || cpufreq_cpu_exists(cpu)) continue; if (params.perf_bias) { ret = msr_intel_set_perf_bias(cpu, perf_bias); if (ret) { fprintf(stderr, _("Error setting perf-bias " "value on CPU %d\n"), cpu); break; } } } return ret; }
int cmd_set(int argc, char **argv) { extern char *optarg; extern int optind, opterr, optopt; unsigned int cpu; union { struct { int sched_mc:1; int sched_smt:1; int perf_bias:1; }; int params; } params; int sched_mc = 0, sched_smt = 0, perf_bias = 0; int ret = 0; setlocale(LC_ALL, ""); textdomain(PACKAGE); params.params = 0; while ((ret = getopt_long(argc, argv, "m:s:b:", set_opts, NULL)) != -1) { switch (ret) { case 'b': if (params.perf_bias) print_wrong_arg_exit(); perf_bias = atoi(optarg); if (perf_bias < 0 || perf_bias > 15) { printf(_("--perf-bias param out " "of range [0-%d]\n"), 15); print_wrong_arg_exit(); } params.perf_bias = 1; break; case 'm': if (params.sched_mc) print_wrong_arg_exit(); sched_mc = atoi(optarg); if (sched_mc < 0 || sched_mc > 2) { printf(_("--sched-mc param out " "of range [0-%d]\n"), 2); print_wrong_arg_exit(); } params.sched_mc = 1; break; case 's': if (params.sched_smt) print_wrong_arg_exit(); sched_smt = atoi(optarg); if (sched_smt < 0 || sched_smt > 2) { printf(_("--sched-smt param out " "of range [0-%d]\n"), 2); print_wrong_arg_exit(); } params.sched_smt = 1; break; default: print_wrong_arg_exit(); } }; if (!params.params) print_wrong_arg_exit(); if (params.sched_mc) { ret = sysfs_set_sched("mc", sched_mc); if (ret) fprintf(stderr, _("Error setting sched-mc %s\n"), (ret == -ENODEV) ? "not supported" : ""); } if (params.sched_smt) { ret = sysfs_set_sched("smt", sched_smt); if (ret) fprintf(stderr, _("Error setting sched-smt %s\n"), (ret == -ENODEV) ? "not supported" : ""); } if (bitmask_isallclear(cpus_chosen)) bitmask_setall(cpus_chosen); for (cpu = bitmask_first(cpus_chosen); cpu <= bitmask_last(cpus_chosen); cpu++) { if (!bitmask_isbitset(cpus_chosen, cpu) || cpufreq_cpu_exists(cpu)) continue; if (params.perf_bias) { ret = msr_intel_set_perf_bias(cpu, perf_bias); if (ret) { fprintf(stderr, _("Error setting perf-bias " "value on CPU %d\n"), cpu); break; } } } return ret; }