/** * @brief * get_cpubits() and get_membits() initialize memory bitmasks used to * represent the CPUs (resp. memory boards) discovered while parsing * vnode definitions files. * * @param[in] m - pointer to bitmask structure * * @return Void * */ void get_membits(struct bitmask *m) { assert(m != NULL); if (mem_mask != NULL) { assert(bitmask_nbits(m) == bitmask_nbits(mem_mask)); (void) bitmask_copy(m, mem_mask); } else { bitmask_clearall(m); log_err(PBSE_SYSTEM, __func__, "mem_mask not yet initialized"); } }
/** * @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); }
/* * 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); }