/* * get the number of the nodes including offline nodes */ int get_nmems(void) { struct bitmask *bmp = NULL; int n = 0; /* get the bitmask's len */ if (mems_nbits <= 0) { mems_nbits = cpuset_mems_nbits(); if (mems_nbits <= 0) return -1; } /* allocate the space for bitmask */ bmp = bitmask_alloc(mems_nbits); if (bmp == NULL) return -1; if (present_memmask(bmp)) { bitmask_free(bmp); return -1; } /* Numbwe of highest set bit +1 is the number of the nodes */ if (bitmask_weight(bmp) <= 0) { bitmask_free(bmp); return -1; } n = bitmask_last(bmp) + 1; bitmask_free(bmp); return n; }
int main(int argc, const char *argv[]) { const char *cmd; unsigned int i, ret; struct stat statbuf; struct utsname uts; cpus_chosen = bitmask_alloc(sysconf(_SC_NPROCESSORS_CONF)); argc--; argv += 1; handle_options(&argc, &argv); cmd = argv[0]; if (argc < 1) { print_help(); return EXIT_FAILURE; } setlocale(LC_ALL, ""); textdomain(PACKAGE); /* Turn "perf cmd --help" into "perf help cmd" */ if (argc > 1 && !strcmp(argv[1], "--help")) { argv[1] = argv[0]; argv[0] = cmd = "help"; } get_cpu_info(0, &cpupower_cpu_info); run_as_root = !getuid(); if (run_as_root) { ret = uname(&uts); if (!ret && !strcmp(uts.machine, "x86_64") && stat("/dev/cpu/0/msr", &statbuf) != 0) { if (system("modprobe msr") == -1) fprintf(stderr, _("MSR access not available.\n")); } } for (i = 0; i < ARRAY_SIZE(commands); i++) { struct cmd_struct *p = commands + i; if (strcmp(p->cmd, cmd)) continue; if (!run_as_root && p->needs_root) { fprintf(stderr, _("Subcommand %s needs root " "privileges\n"), cmd); return EXIT_FAILURE; } ret = p->main(argc, argv); if (cpus_chosen) bitmask_free(cpus_chosen); return ret; } print_help(); return EXIT_FAILURE; }
int main(int argc, const char *argv[]) { const char *cmd; unsigned int i, ret; cpus_chosen = bitmask_alloc(sysconf(_SC_NPROCESSORS_CONF)); argc--; argv += 1; handle_options(&argc, &argv); cmd = argv[0]; if (argc < 1) { print_help(); return EXIT_FAILURE; } setlocale(LC_ALL, ""); textdomain(PACKAGE); if (argc > 1 && !strcmp(argv[1], "--help")) { argv[1] = argv[0]; argv[0] = cmd = "help"; } get_cpu_info(0, &cpupower_cpu_info); run_as_root = !getuid(); for (i = 0; i < ARRAY_SIZE(commands); i++) { struct cmd_struct *p = commands + i; if (strcmp(p->cmd, cmd)) continue; if (!run_as_root && p->needs_root) { fprintf(stderr, _("Subcommand %s needs root " "privileges\n"), cmd); return EXIT_FAILURE; } ret = p->main(argc, argv); if (cpus_chosen) bitmask_free(cpus_chosen); return ret; } print_help(); return EXIT_FAILURE; }
/* * check sched domains in system * * return 0 - sched domains is true * 1 - sched domains is wrong, and print error info * -1 - other error */ void check_sched_domains(void) { int i; char buf1[128], buf2[128]; struct bitmask *alldomains = NULL; /* get the bitmask's len */ if (!cpus_nbits) { cpus_nbits = cpuset_cpus_nbits(); if (cpus_nbits <= 0) { tst_resm(TFAIL, "get cpus nbits failed"); return; } } if (getcpuinfo()) { tst_resm(TFAIL, "getcpuinfo failed"); return; } if (partition_domains()) { tst_resm(TFAIL, "partition domains failed."); return; } alldomains = bitmask_alloc(cpus_nbits); if (alldomains == NULL) { tst_resm(TFAIL, "alloc alldomains space failed."); return; } for (i = 0; i < ndomains; i++) { unsigned int cpu; bitmask_or(alldomains, alldomains, domains[i]); for (cpu = bitmask_first(domains[i]); cpu < bitmask_nbits(domains[i]); cpu = bitmask_next(domains[i], cpu + 1)) { if (bitmask_weight(domains[i]) == 1) { if (cpus[cpu].sched_domain != NULL) { bitmask_displaylist(buf1, sizeof(buf1), domains[i]); bitmask_displaylist(buf2, sizeof(buf2), cpus[cpu].sched_domain); tst_resm(TFAIL, "cpu%d's sched domain is not " "NULL(Domain: %s, " "CPU's Sched Domain: %s).", cpu, buf1, buf2); goto err; } break; } if (!bitmask_equal(domains[i], cpus[cpu].sched_domain)) { bitmask_displaylist(buf1, sizeof(buf1), domains[i]); bitmask_displaylist(buf2, sizeof(buf2), cpus[cpu].sched_domain); tst_resm(TFAIL, "cpu%d's sched domain is wrong" "(Domain: %s, CPU's Sched Domain: %s).", cpu, buf1, buf2); goto err; } } } for (i = 0; i < ncpus; i++) { if (bitmask_isbitset(alldomains, i)) continue; if (cpus[i].sched_domain) { tst_resm(TFAIL, "cpu%d has redundant sched domain", i); goto err; } } tst_resm(TPASS, "check_sched_domains passed"); err: bitmask_free(alldomains); }
/* * hog the cpu time and check the cpu which the task is running on is in the * cpus of the cpuset or not. * * return value: 0 - success. * 1 - the cpu which the task is running on isn't in the cpus * of the cpuset. * -1 - failure for other reason. */ int cpu_hog(void) { double f = 2744545.34456455; sigset_t sigset; struct cpuset *cp = NULL; struct bitmask *cpumask = NULL; int cpu; int nbits; int ret = 0; nbits = cpuset_cpus_nbits(); cp = cpuset_alloc(); if (cp == NULL) return -1; cpumask = bitmask_alloc(nbits); if (cpumask == NULL) { ret = -1; goto err1; } if (sigemptyset(&sigset) < 0) { ret = -1; goto err2; } sigsuspend(&sigset); if (cpuset_cpusetofpid(cp, 0) < 0) { ret = -1; goto err2; } if (cpuset_getcpus(cp, cpumask) != 0) { ret = -1; goto err2; } while (!end) { f = sqrt(f * f); cpu = cpuset_latestcpu(0); if (cpu < 0) { warn("get latest cpu failed.\n"); ret = -1; goto err2; } if (!bitmask_isbitset(cpumask, cpu)) { char str[50]; bitmask_displaylist(str, 50, cpumask); warn("the task(%d) is running on the cpu(%d) excluded" " by cpuset(cpus: %s)\n", getpid(), cpu, str); ret = 1; goto err2; } } err2: bitmask_free(cpumask); err1: cpuset_free(cp); return ret; }