7 int cpumap
[MAX_NR_CPUS
];
9 static int default_cpu_map(void)
13 nr_cpus
= sysconf(_SC_NPROCESSORS_ONLN
);
14 assert(nr_cpus
<= MAX_NR_CPUS
);
15 assert((int)nr_cpus
>= 0);
17 for (i
= 0; i
< nr_cpus
; ++i
)
23 static int read_all_cpu_map(void)
30 onlnf
= fopen("/sys/devices/system/cpu/online", "r");
32 return default_cpu_map();
37 n
= fscanf(onlnf
, "%u%c", &cpu
, &sep
);
41 assert(nr_cpus
+ cpu
- prev
- 1 < MAX_NR_CPUS
);
43 cpumap
[nr_cpus
++] = prev
;
45 assert (nr_cpus
< MAX_NR_CPUS
);
46 cpumap
[nr_cpus
++] = cpu
;
47 if (n
== 2 && sep
== '-')
51 if (n
== 1 || sep
== '\n')
58 return default_cpu_map();
61 int read_cpu_map(const char *cpu_list
)
63 unsigned long start_cpu
, end_cpu
= 0;
68 return read_all_cpu_map();
70 if (!isdigit(*cpu_list
))
73 while (isdigit(*cpu_list
)) {
75 start_cpu
= strtoul(cpu_list
, &p
, 0);
76 if (start_cpu
>= INT_MAX
77 || (*p
!= '\0' && *p
!= ',' && *p
!= '-'))
83 end_cpu
= strtoul(cpu_list
, &p
, 0);
85 if (end_cpu
>= INT_MAX
|| (*p
!= '\0' && *p
!= ','))
88 if (end_cpu
< start_cpu
)
94 for (; start_cpu
<= end_cpu
; start_cpu
++) {
95 /* check for duplicates */
96 for (i
= 0; i
< nr_cpus
; i
++)
97 if (cpumap
[i
] == (int)start_cpu
)
100 assert(nr_cpus
< MAX_NR_CPUS
);
101 cpumap
[nr_cpus
++] = (int)start_cpu
;
111 return default_cpu_map();