示例#1
0
/**
 * @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");
	}
}
示例#2
0
/**
 * @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);
}
示例#3
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);
}