int main(int argc, char **argv) { struct bitmask *mask1 = NULL, *mask2 = NULL, *mask3 = NULL; char buff[MAX_STRING_SIZE]; checkopt(argc, argv); mask1 = bitmask_alloc(MAX_NBITS); if (mask1 == NULL) err(EXIT_FAILURE, "alloc memory space for bitmask1 failed."); mask2 = bitmask_alloc(MAX_NBITS); if (mask2 == NULL) err(EXIT_FAILURE, "alloc memory space for bitmask2 failed."); mask3 = bitmask_alloc(MAX_NBITS); if (mask3 == NULL) err(EXIT_FAILURE, "alloc memory space for bitmask3 failed."); if (bitmask_parselist(argv[argc - 2 + convert], mask1) != 0) err(EXIT_FAILURE, "parse list1 string failed."); if (convert) { bitmask_displaylist(buff, MAX_STRING_SIZE, mask1); printf("%s\n", buff); return 0; } if (bitmask_parselist(argv[argc - 1], mask2) != 0) err(EXIT_FAILURE, "parse list2 string failed."); if (add_or_subtract) bitmask_andnot(mask3, mask1, mask2); else bitmask_or(mask3, mask1, mask2); bitmask_displaylist(buff, MAX_STRING_SIZE, mask3); printf("%s\n", buff); 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); }