xref: /mOS-networking-stack/util/cpu.c (revision 76404edc)
1 #ifndef _GNU_SOURCE
2 #define _GNU_SOURCE
3 #endif
4 
5 #include <unistd.h>
6 #include <errno.h>
7 #include <numa.h>
8 #include <sched.h>
9 #include <sys/stat.h>
10 #include <assert.h>
11 
12 /*----------------------------------------------------------------------------*/
GetNumCPUs()13 int GetNumCPUs()
14 {
15 	return sysconf(_SC_NPROCESSORS_ONLN);
16 }
17 /*----------------------------------------------------------------------------*/
18 int
CoreAffinitize(int cpu)19 CoreAffinitize(int cpu)
20 {
21 	cpu_set_t *cmask;
22 	struct bitmask *bmask;
23 	size_t n;
24 	int ret;
25 
26 	n = GetNumCPUs();
27 
28 	if (cpu < 0 || cpu >= (int) n) {
29 		errno = -EINVAL;
30 		return -1;
31 	}
32 
33 	cmask = CPU_ALLOC(n);
34 	if (cmask == NULL)
35 		return -1;
36 
37 	CPU_ZERO_S(n, cmask);
38 	CPU_SET_S(cpu, n, cmask);
39 
40 	ret = sched_setaffinity(0, n, cmask);
41 
42 	CPU_FREE(cmask);
43 
44 	if (numa_max_node() == 0)
45 		return ret;
46 
47 	bmask = numa_bitmask_alloc(16);
48 	assert(bmask);
49 
50 	numa_bitmask_setbit(bmask, cpu %2);
51 	numa_set_membind(bmask);
52 	numa_bitmask_free(bmask);
53 
54 	return ret;
55 }
56