1aeafd8315e2d0d31207b54e6b246f1dae4836e18Stanislav Kholmanskikh#include "config.h"
270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#include <stdio.h>
370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#include <stdlib.h>
470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#include <string.h>
570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#include <sys/types.h>
670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#include <dirent.h>
770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#include <err.h>
870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#include <errno.h>
970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
1070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#include "bitmask.h"
1170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#include "cpuset.h"
1270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#include "common.h"
1370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#include "cpuinfo.h"
1470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
15397ae83c6395406527786c4afd74b36356670934yaberauneya#if HAVE_LINUX_MEMPOLICY_H
16397ae83c6395406527786c4afd74b36356670934yaberauneya
1770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#define CPUINFO_FILE		"/proc/cpuinfo"
1870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#define SCHEDSTAT_FILE		"/proc/schedstat"
1970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#define CGROUPINFO_FILE		"/proc/cgroups"
2070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#define SYS_CPU_DIR		"/sys/devices/system/cpu"
2170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#define LIST_PRESENT_CPU_FILE	"/sys/devices/system/cpu/present"
2270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak#define LIST_ONLINE_CPU_FILE	"/sys/devices/system/cpu/online"
2370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
2470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakstruct cpuinfo *cpus;
2570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakint ncpus;
2670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakint cpus_nbits;
2770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
2870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak/* get cpu_baseinfo from /proc/cpuinfo */
2970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakstatic int get_cpu_baseinfo(void)
3070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak{
3170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	FILE *fp = NULL;
3270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	char buf[BUFFSIZE];
3370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	char *istr = NULL, *valstr = NULL, *saveptr = NULL;
3470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int ci = 0;
3570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int data = 0;
3670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
3770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* get the number of cpus including offline cpus */
3870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (!ncpus) {
3970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		ncpus = get_ncpus();
4070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (ncpus <= 0)
4170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			return -1;
4270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
4370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
4470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cpus != NULL) {
4570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		free(cpus);
4670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		cpus = NULL;
4770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
4870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
4970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* allocate the memory space for cpus */
50d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis	cpus = malloc(sizeof(*cpus) * ncpus);
5170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cpus == NULL)
5270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
5370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	memset(cpus, 0, sizeof(*cpus) * ncpus);
5470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
5570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* open file /proc/cpuinfo */
5670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if ((fp = fopen(CPUINFO_FILE, "r")) == NULL)
5770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
5870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
5970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* get cpuinfo */
6070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	while (fgets(buf, sizeof(buf), fp) != NULL) {
6170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		istr = strtok_r(buf, "\t", &saveptr);
6270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		valstr = index(saveptr, ':');
6370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (valstr == NULL)
6470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			continue;
6570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		valstr++;
6670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		sscanf(valstr, " %d\n", &data);
6770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (!strcmp(istr, "processor")) {
6870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			if (data >= ncpus) {
6970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				warnx("Warn: wrong cpu index");
7070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				fclose(fp);
7170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				return -1;
7270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			}
7370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			ci = data;
7470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			cpus[ci].online = 1;
7570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		}
7670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
7770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
7870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	fclose(fp);
7970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	return 0;
8070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak}
8170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
8270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak/*
8370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak * get the cpu bitmask of the online processors
842c28215423293e443469a07ae7011135d058b671Garrett Cooper *
8570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak * return value: 0  - success
8670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak *               -1 - failed
8770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak */
8870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakint online_cpumask(struct bitmask *cpumask)
8970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak{
9070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	FILE *fp = NULL;
9170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	char buf[BUFFSIZE];
9270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int i;
9370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
9470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cpumask == NULL)
9570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
9670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/*
9770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	 * open file /sys/devices/system/cpu/online and get online
9870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	 * cpulist.
9970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	 */
10070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if ((fp = fopen(LIST_ONLINE_CPU_FILE, "r")) == NULL) {
10170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (get_cpu_baseinfo() != 0)
10270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			return -1;
10370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		for (i = 0; i < ncpus; i++) {
10470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			if (cpus[i].online)
10570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				bitmask_setbit(cpumask, i);
10670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		}
10770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	} else {
10870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (fgets(buf, sizeof(buf), fp) == NULL) {
10970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			fclose(fp);
11070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			return -1;
11170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		}
11270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		fclose(fp);
11370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
11470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		/* parse present cpu list to bitmap */
11570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		buf[strlen(buf) - 1] = '\0';
11670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (bitmask_parselist(buf, cpumask) != 0)
11770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			return -1;
11870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
11970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
12070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	return 0;
12170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak}
12270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
12370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak/*
12470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak * get the cpu bitmask of the present processors including offline CPUs
1252c28215423293e443469a07ae7011135d058b671Garrett Cooper *
12670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak * return value: 0  - success
12770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak *               -1 - failed
12870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak */
12970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakint present_cpumask(struct bitmask *cpumask)
13070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak{
13170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	FILE *fp = NULL;
13270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	char buf[BUFFSIZE];
13370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	char c_relpath[PATH_MAX];
13470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int cpu = -1;
13570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
13670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cpumask == NULL)
13770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
13870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/*
13970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	 * open file /sys/devices/system/cpu/present and get present
14070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	 * cpulist.
14170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	 */
14270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if ((fp = fopen(LIST_PRESENT_CPU_FILE, "r")) == NULL) {
14370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		while_each_childdir(SYS_CPU_DIR, "/", c_relpath,
144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    sizeof(c_relpath)) {
14570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			if (!strncmp(c_relpath + 1, "cpu", 3)
14670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			    && sscanf(c_relpath + 4, "%d", &cpu) > 0) {
14770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				if (cpu >= 0)
148354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					bitmask_setbit(cpumask, cpu);
14970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			}
150354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
151354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	end_while_each_childdir} else {
15270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (fgets(buf, sizeof(buf), fp) == NULL) {
15370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			fclose(fp);
15470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			return -1;
15570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		}
15670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		fclose(fp);
15770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
15870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		/* parse present cpu list to bitmap */
15970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		buf[strlen(buf) - 1] = '\0';
16070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (bitmask_parselist(buf, cpumask) != 0)
16170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			return -1;
16270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
16370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
16470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	return 0;
16570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak}
16670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
16770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak/*
16870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak * get the number of the processors including offline CPUs
16970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak * We get this number from /sys/devices/system/cpu/present.
17070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak * By analyzing the present cpu list, we get the number of all cpus
17170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak */
17270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakint get_ncpus(void)
17370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak{
17470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	struct bitmask *bmp = NULL;
17570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int n = 0;
17670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
17770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* get the bitmask's len */
17870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	cpus_nbits = cpuset_cpus_nbits();
17970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cpus_nbits <= 0)
18070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
18170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
18270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* allocate the space for bitmask */
18370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	bmp = bitmask_alloc(cpus_nbits);
18470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (bmp == NULL)
18570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
18670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
18770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (present_cpumask(bmp)) {
18870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		bitmask_free(bmp);
18970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
19070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
19170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
19270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* Number of highest set bit +1 is the number of the CPUs */
19370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	n = bitmask_last(bmp) + 1;
19470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	bitmask_free(bmp);
19570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
19670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	return n;
19770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak}
19870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
19970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak/* get the sched domain's info for each cpu */
20070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakstatic int get_sched_domains(void)
20170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak{
20270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	FILE *fp = NULL;
20370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	char buf[BUFFSIZE];
20470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	char str1[20], str2[BUFFSIZE];
20570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int ci = 0;
20670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
20770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* get the bitmask's len */
20870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (!cpus_nbits) {
20970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		cpus_nbits = cpuset_cpus_nbits();
21070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (cpus_nbits <= 0) {
21170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			warnx("get cpus nbits failed.");
21270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			return -1;
21370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		}
21470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
21570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
21670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* open file /proc/schedstat */
21770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if ((fp = fopen(SCHEDSTAT_FILE, "r")) == NULL)
21870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
21970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
22070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* get cpuinfo */
22170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	while (fgets(buf, sizeof(buf), fp) != NULL) {
22270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		sscanf(buf, "%s %s", str1, str2);
22370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (!strncmp(str1, "cpu", 3)) {
22470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			ci = atoi(str1 + 3);
22570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			if (ci < 0 || ci >= ncpus) {
22670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				fprintf(stderr, "Warn: wrong cpu index");
22770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				fclose(fp);
22870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				return -1;
22970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			}
23070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		} else if (!strncmp(str1, "domain", 6)) {
23170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			if (!cpus[ci].sched_domain) {
232354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				cpus[ci].sched_domain =
233354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    bitmask_alloc(cpus_nbits);
234f5b5b063a58d42d20dc2cb49b7d7c86c2f9e2819Wei,Jiangang				if (!cpus[ci].sched_domain) {
235f5b5b063a58d42d20dc2cb49b7d7c86c2f9e2819Wei,Jiangang					fclose(fp);
23670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak					return -1;
237f5b5b063a58d42d20dc2cb49b7d7c86c2f9e2819Wei,Jiangang				}
23870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			}
239f5b5b063a58d42d20dc2cb49b7d7c86c2f9e2819Wei,Jiangang			if (bitmask_parsehex(str2, cpus[ci].sched_domain)) {
240f5b5b063a58d42d20dc2cb49b7d7c86c2f9e2819Wei,Jiangang				fclose(fp);
24170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				return -1;
242f5b5b063a58d42d20dc2cb49b7d7c86c2f9e2819Wei,Jiangang			}
24370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		}
24470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
24570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
24670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	fclose(fp);
24770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	return 0;
24870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak}
24970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
25070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakint getcpuinfo(void)
25170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak{
25270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int i;
25370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int node = -1;
25470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
25570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* get the number of cpus including offline cpus */
25670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (!ncpus) {
25770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		ncpus = get_ncpus();
25870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (ncpus <= 0)
25970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			return -1;
26070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
26170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
26270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cpus == NULL) {
26370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (get_cpu_baseinfo() != 0) {
26470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			warn("get base infomation of cpus from /proc/cpuinfo "
265354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     "failed.");
26670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			return -1;
26770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		}
26870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
26970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
27070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* which node is every cpu belong to? */
27170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	for (i = 0; i < ncpus; i++) {
27270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		node = cpuset_cpu2node(i);
27370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (node == -1)
27470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			warnx("cpu2node failed(cpu = %d)", i);
27570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		cpus[i].nodeid = node;
27670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
27770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
27870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* get sched domain's infomation for each cpu */
27970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (get_sched_domains()) {
28070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		warnx("get sched domain's info for each cpu failed.");
28170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
28270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
28370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
28470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	return 0;
28570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak}
28670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
28770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak/* get the number of the cpuset groups */
28870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakstatic int get_num_cpusets(void)
28970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak{
29070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	FILE *fp = NULL;
29170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	char buf[BUFFSIZE];
29270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	char subsys_name[BUFFSIZE];
29370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int num_cgroups = 0;
29470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int hierarchy;
29570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int enabled;
29670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
29770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	/* open file /proc/cgroups and get num cpusets */
29870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if ((fp = fopen(CGROUPINFO_FILE, "r")) == NULL)
29970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
30070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
30170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	while (fgets(buf, sizeof(buf), fp) != NULL) {
30270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (!strncmp(buf, "cpuset", 6)) {
30370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			sscanf(buf, "%s\t%d\t%d\t%d\n", subsys_name,
304354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       &hierarchy, &num_cgroups, &enabled);
30570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		}
30670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
30770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
30870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	fclose(fp);
30970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
31070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	return num_cgroups;
31170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak}
31270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
31370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakstatic struct cpuset **cpusets;
31470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakstatic int ncpusets;
31570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
31670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakstatic int find_domain_cpusets(char *relpath)
31770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak{
31870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	struct cpuset *cp = NULL;
31970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	char c_relpath[PATH_MAX];
32070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int ret = 0;
32170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
32270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (relpath == NULL) {
32370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		errno = -EFAULT;
32470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
32570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
32670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
32770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	cp = cpuset_alloc();
32870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cp == NULL) {
32970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		errno = -ENOMEM;
33070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
33170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
33270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
33370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cpuset_query(cp, relpath)) {
33470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		cpuset_free(cp);
33570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
33670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
33770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
33870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cpuset_cpus_weight(cp) == 0)
33970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return 0;
34070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
34170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cpuset_cpus_weight(cp) > 0
342354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    && cpuset_get_iopt(cp, "sched_load_balance") == 1) {
34370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		cpusets[ncpusets] = cp;
34470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		ncpusets++;
34570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return 0;
34670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
34770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
34870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	while_each_childdir(cpuset_mountpoint(), relpath, c_relpath,
349354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    sizeof(c_relpath)) {
35070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if ((ret = find_domain_cpusets(c_relpath)))
351354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			break;
352354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
353354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	end_while_each_childdir;
35470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
35570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	return ret;
35670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak}
35770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
35870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakstruct bitmask **domains;
35970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakint ndomains;
36070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
36170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakint partition_domains(void)
36270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak{
36370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int num_cpusets = 0;
36470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int i, j;
36570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	struct bitmask *cpusa = NULL, *cpusb = NULL, *cpusc = NULL;
36670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int *flg = NULL;
36770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	int ret = 0;
36870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
36970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	num_cpusets = get_num_cpusets();
37070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (num_cpusets == 0) {
37170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		warnx("cpuset subsystem is't compiled into kernel.");
37270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
37370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
37470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
37570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (!cpus_nbits) {
37670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		cpus_nbits = cpuset_cpus_nbits();
37770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (!cpus_nbits) {
37870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			warnx("nbits of cpus is wrong.");
37970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			return -1;
38070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		}
38170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
38270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
38370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	cpusa = bitmask_alloc(cpus_nbits);
38470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cpusa == NULL) {
38570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		warnx("bitmask_alloc for partition domains failed.");
38670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		return -1;
38770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
38870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
38970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	cpusb = bitmask_alloc(cpus_nbits);
39070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cpusb == NULL) {
39170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		warnx("bitmask_alloc for partition domains failed.");
39270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		ret = -1;
39370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		goto errcpusb;
39470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
39570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
39670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	cpusc = bitmask_alloc(cpus_nbits);
39770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cpusb == NULL) {
39870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		warnx("bitmask_alloc for partition domains failed.");
39970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		ret = -1;
40070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		goto errcpusc;
40170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
40270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
403d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis	cpusets = malloc(num_cpusets * sizeof(*cpusets));
40470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (cpusets == NULL) {
40570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		warnx("alloc cpusets space failed.");
40670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		ret = -1;
40770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		goto errcpusets;
40870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
40970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
41070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if ((ret = find_domain_cpusets("/"))) {
41170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		warnx("find domain cpusets failed.");
41270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		goto errfindcpusets;
41370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
41470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
415d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis	flg = malloc(num_cpusets * sizeof(int));
41670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (flg == NULL) {
41770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		warnx("alloc flg failed.");
41870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		ret = -1;
41970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		goto errfindcpusets;
42070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
42170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	memset(flg, 0, num_cpusets * sizeof(int));
42270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
42370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	ndomains = ncpusets;
42470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakrestart:
42570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	for (i = 0; i < ncpusets; i++) {
42670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		struct cpuset *cpa = cpusets[i];
42770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
42870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (flg[i])
42970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			continue;
43070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
43170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		cpuset_getcpus(cpa, cpusa);
43270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
43370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		for (j = i + 1; j < ncpusets; j++) {
43470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			struct cpuset *cpb = cpusets[j];
43570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
43670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			if (flg[j])
43770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				continue;
43870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
43970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			cpuset_getcpus(cpb, cpusb);
44070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			if (bitmask_intersects(cpusa, cpusb)) {
44170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				bitmask_or(cpusc, cpusa, cpusb);
44270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				cpuset_setcpus(cpa, cpusc);
44370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				flg[j] = 1;
44470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				ndomains--;
44570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak				goto restart;
44670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			}
44770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		}
44870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
44970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
450d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis	domains = malloc(ndomains * sizeof(*domains));
45170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	if (domains == NULL) {
45270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		warnx("alloc domains space failed.");
45370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		ret = -1;
45470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		goto errdomains;
45570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
45670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
45770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	for (i = 0, j = 0; i < ncpusets; i++) {
45870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (flg[i])
45970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			continue;
46070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		domains[j] = bitmask_alloc(cpus_nbits);
46170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		if (cpuset_getcpus(cpusets[i], domains[j])) {
46270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			warnx("cpuset getcpus failed.");
46370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			ret = -1;
46470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak			goto errgetdomains;
46570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		}
46670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		j++;
46770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	}
46870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	goto errdomains;
46970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak
47070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakerrgetdomains:
47170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	for (i = 0; i < j; i++)
47270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		bitmask_free(domains[i]);
47370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	free(domains);
47470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	domains = NULL;
47570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakerrdomains:
47670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	free(flg);
47770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakerrfindcpusets:
47870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	for (i = 0; i < ncpusets; i++)
47970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak		cpuset_free(cpusets[i]);
48070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	free(cpusets);
48170259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	cpusets = NULL;
48270259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	ncpusets = 0;
48370259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakerrcpusets:
48470259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	bitmask_free(cpusc);
48570259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakerrcpusc:
48670259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	bitmask_free(cpusb);
48770259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modakerrcpusb:
48870259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	bitmask_free(cpusa);
48970259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak	return ret;
49070259d6e7ec2569972fb663ea85f959c4f2b4f81subrata_modak}
491397ae83c6395406527786c4afd74b36356670934yaberauneya
492ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman#endif
493