/** * @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); }
/* * 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; }