/** * @brief * Add a memory node to the memory mask that is constructed while reading * vnode definitions files. * * @param[in] memnum - memory board node id * * @return int * @retval 0 Success * @retval -1 Failure * */ static int memmask_add(unsigned int memnum) { if (mem_mask == NULL) { if (mems_nbits == 0) mems_nbits = cpuset_mems_nbits(); mem_mask = bitmask_alloc(mems_nbits); if (mem_mask == NULL) { log_err(PBSE_SYSTEM, __func__, "bitmask_alloc failed"); return (-1); } else bitmask_clearall(mem_mask); } assert(memnum < bitmask_nbits(mem_mask)); (void) bitmask_setbit(mem_mask, memnum); return (0); }
/** * @brief * Add a CPU to the mask of CPUs that is constructed while reading * vnode definitions files. * * @param[in] cpunum - number of cpus * * @return int * @retval 0 Success * @retval -1 Failure * */ static int cpumask_add(unsigned int cpunum) { if (cpu_mask == NULL) { if (cpus_nbits == 0) cpus_nbits = cpuset_cpus_nbits(); cpu_mask = bitmask_alloc(cpus_nbits); if (cpu_mask == NULL) { log_err(PBSE_SYSTEM, __func__, "bitmask_alloc failed"); return (-1); } else bitmask_clearall(cpu_mask); } assert(cpunum < bitmask_nbits(cpu_mask)); (void) bitmask_setbit(cpu_mask, cpunum); return (0); }
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_idle_info(int argc, char **argv) { extern char *optarg; extern int optind, opterr, optopt; int ret = 0, cont = 1, output_param = 0, verbose = 1; unsigned int cpu = 0; do { ret = getopt_long(argc, argv, "os", info_opts, NULL); if (ret == -1) break; switch (ret) { case '?': output_param = '?'; cont = 0; break; case 's': verbose = 0; break; case -1: cont = 0; break; case 'o': if (output_param) { output_param = -1; cont = 0; break; } output_param = ret; break; } } while (cont); switch (output_param) { case -1: printf(_("You can't specify more than one " "output-specific argument\n")); cpuidle_exit(EXIT_FAILURE); case '?': printf(_("invalid or unknown argument\n")); cpuidle_exit(EXIT_FAILURE); } /* Default is: show output of CPU 0 only */ if (bitmask_isallclear(cpus_chosen)) bitmask_setbit(cpus_chosen, 0); if (output_param == 0) cpuidle_general_output(); for (cpu = bitmask_first(cpus_chosen); cpu <= bitmask_last(cpus_chosen); cpu++) { if (!bitmask_isbitset(cpus_chosen, cpu) || cpufreq_cpu_exists(cpu)) continue; switch (output_param) { case 'o': proc_cpuidle_cpu_output(cpu); break; case 0: printf("\n"); cpuidle_cpu_output(cpu, verbose); break; } } return EXIT_SUCCESS; }
int cmd_info(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 ret = 0; setlocale(LC_ALL, ""); textdomain(PACKAGE); /* 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(); params.perf_bias = 1; break; default: print_wrong_arg_exit(); } }; if (!params.params) params.params = 0x7; /* Default is: show output of CPU 0 only */ if (bitmask_isallclear(cpus_chosen)) bitmask_setbit(cpus_chosen, 0); /* Add more per cpu options here */ if (!params.perf_bias) return ret; if (params.perf_bias) { if (!run_as_root) { params.perf_bias = 0; printf(_("Intel's performance bias setting needs root privileges\n")); } else if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_PERF_BIAS)) { printf(_("System does not support Intel's performance" " bias setting\n")); params.perf_bias = 0; } } /* 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(_("analyzing CPU %d:\n"), cpu); if (params.perf_bias) { ret = msr_intel_get_perf_bias(cpu); if (ret < 0) { fprintf(stderr, _("Could not read perf-bias value[%d]\n"), ret); exit(EXIT_FAILURE); } else printf(_("perf-bias: %d\n"), ret); } } return 0; }
int cmd_info(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 ret = 0; setlocale(LC_ALL, ""); textdomain(PACKAGE); while ((ret = getopt_long(argc, argv, "msb", set_opts, NULL)) != -1) { switch (ret) { case 'b': if (params.perf_bias) print_wrong_arg_exit(); params.perf_bias = 1; break; case 'm': if (params.sched_mc) print_wrong_arg_exit(); params.sched_mc = 1; break; case 's': if (params.sched_smt) print_wrong_arg_exit(); params.sched_smt = 1; break; default: print_wrong_arg_exit(); } }; if (!params.params) params.params = 0x7; if (bitmask_isallclear(cpus_chosen)) bitmask_setbit(cpus_chosen, 0); if (params.sched_mc) { ret = sysfs_get_sched("mc"); printf(_("System's multi core scheduler setting: ")); if (ret < 0) printf(_("not supported\n")); else printf("%d\n", ret); } if (params.sched_smt) { ret = sysfs_get_sched("smt"); printf(_("System's thread sibling scheduler setting: ")); if (ret < 0) printf(_("not supported\n")); else printf("%d\n", ret); } if (!params.perf_bias) return ret; if (params.perf_bias) { if (!run_as_root) { params.perf_bias = 0; printf(_("Intel's performance bias setting needs root privileges\n")); } else if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_PERF_BIAS)) { printf(_("System does not support Intel's performance" " bias setting\n")); params.perf_bias = 0; } } for (cpu = bitmask_first(cpus_chosen); cpu <= bitmask_last(cpus_chosen); cpu++) { if (!bitmask_isbitset(cpus_chosen, cpu) || cpufreq_cpu_exists(cpu)) continue; printf(_("analyzing CPU %d:\n"), cpu); if (params.perf_bias) { ret = msr_intel_get_perf_bias(cpu); if (ret < 0) { printf(_("Could not read perf-bias value\n")); break; } else printf(_("perf-bias: %d\n"), ret); } } return ret; }