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